这是一个新的例子,它突出了闭包的数据结构和内容,以帮助澄清封闭上下文何时被“保存” .
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
(,) 43
值得注意的是,my_str不在f1的封闭中 .
f2的关闭是什么?
>>> print f_2.func_closure, f_2.func_closure[0].cell_contents
(,) 43
注意(从内存地址)两个闭包包含相同的对象 . 因此,您可以开始将lambda函数视为具有对范围的引用 . 但是,my_str不在f_1或f_2的闭包中,并且我不在f_3的闭包中(未显示),这表明闭包对象本身是不同的对象 .
闭包对象本身是同一个对象吗?
>>> print f_1.func_closure is f_2.func_closure
False