Вот новый пример, который выделяет структуру данных и содержимое замыкания, чтобы помочь уточнить, когда включающий контекст «сохраняется».
def make_funcs():
i = 42
my_str = "hi"
f_one = lambda: i
i += 1
f_two = lambda: i+1
f_three = lambda: my_str
return f_one, f_two, f_three
f_1, f_2, f_3 = make_funcs()
Что находится в замыкании?
>>> print f_1.func_closure, f_1.func_closure[0].cell_contents
(<cell at 0x106a99a28: int object at 0x7fbb20c11170>,) 43
Примечательно, что my_str не находится в закрытии f1.
Что находится в закрытии f2?
>>> print f_2.func_closure, f_2.func_closure[0].cell_contents
(<cell at 0x106a99a28: int object at 0x7fbb20c11170>,) 43
Обратите внимание (по адресам памяти), что оба замыкания содержат одинаковые объекты. Таким образом, вы можете start думать о лямбда-функции как о ссылке на область видимости. Однако my_str не находится в замыкании для f_1 или f_2, а i не находится в замыкании для f_3 (не показано), что предполагает, что сами объекты замыкания являются отдельными объектами.
Являются ли сами объекты замыкания одним и тем же объектом?
>>> print f_1.func_closure is f_2.func_closure
False