Как мне получить доступ / изменить переменные из замыкания функции? - PullRequest
2 голосов
/ 24 марта 2019

Если у меня есть функция, имеющая некоторую нелокальную переменную (в замыкании), как мне получить доступ к этой переменной? Могу ли я изменить его, и если да, то как? Вот пример такой функции:

def outer():
    x = 1
    def inner(y):
        nonlocal x
        return x + y
    return inner

inner = outer()
# how do I get / change the value of x inside inner?

(извинения, если на этот вопрос уже ответили в другом месте; я не смог его найти, поэтому подумал, что поделюсь ответом, как только разберусь с ним)

1 Ответ

2 голосов
/ 24 марта 2019

Вложенные переменные функции хранятся в виде кортежа в атрибуте __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, которая отслеживала установки значений ячеек).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...