Где в python хранится закрытие и нелокальная переменная (свободная переменная)? Как работает привязка в замыкании? - PullRequest
1 голос
/ 27 марта 2020

Я понимаю, что python хранит стек вызовов и ссылки в стеке, а объекты значений - в куче. Но как замыкание и особенно нелокальные переменные (переменные, определенные во внешней функции и используемые внутри замыкания) попадают в эту категорию?

В описании замыкания говорится Закрытие - это функциональный объект, который запоминает значения во вложенных областях, даже если они отсутствуют в памяти. Тем не менее, мы все знаем, что невозможно получить доступ к какому-либо значению, если оно действительно исчезает в памяти. Значит ли это, что ссылка нелокальных переменных (в стеке) освобождается, но их объекты значений (в куче) сохраняются и передаются закрытием?

Обновление: I запустил следующий код и, очевидно, адрес свободной переменной никогда не изменяется, что (вероятно) означает, что объекты-значения в куче не удаляются даже после завершения внешней функции ... но все же: если внешняя функция удаляется из памяти после это называется, где хранится содержимое внутренней функции? и является ли ссылка (то есть имя) свободных переменных, также неизменной в стеке, или внутренняя функция фактически имеет другую копию этих имен, которая ссылается на объекты истинного значения в куче?

код, который я использовал:

def fn_out(a):
    print("fn_out::a", hex(id(a)))
    def fn_in(b):
        print("fn_in::a", hex(id(a)))
        return a * b
    return fn_in

f = fn_out(3)
# freevars = f.__code__.co_freevars
for i, v in enumerate(f.__closure__):
    c = v.cell_contents
    print("the %ith free variable: at"%i, hex(id(c)), "content:", c)
f(2)

вывод:

fn_out::a 0x9a3140                                                 
the 0th free variable: at 0x9a3140 content: 3                      
fn_in::a 0x9a3140   
...