Вложенные переменные функции хранятся в виде кортежа в атрибуте __closure__
.Переменные хранятся в виде cell
, который выглядит как изменяемый контейнер для самой переменной.Вы можете получить доступ к переменной, которую cell
хранит как cell.cell_contents
.Поскольку ячейки изменчивы, вы можете изменить значения нелокальных переменных функции, изменив содержимое ячейки.Вот пример:
def outer():
x = 1
def inner(y):
nonlocal x
return x + y
return inner
inner = outer()
print(inner(2)) # 3
print(inner.__closure__) # (<cell at 0x7f14356caf78: int object at 0x56487ab30380>,)
print(inner.__closure__[0].cell_contents) # 1
inner.__closure__[0].cell_contents = 10
print(inner(2)) # 12
print(inner.__closure__[0].cell_contents) # 10
РЕДАКТИРОВАТЬ - приведенный выше ответ относится к Python 3.7+.Для других версий Python вы можете получить доступ к закрытию таким же образом, но вы не можете изменить вложенные переменные ( здесь проблема Python, которая отслеживала установки значений ячеек).