来自Programming Language Pragmatics by Scott,
图3.14 Python中的深层绑定。右边是运行时堆栈的概念视图。 在闭包中捕获的引用环境显示为虚线框和箭头。什么时候 B通过形式参数P调用,存在两个实例。 因为P的封闭是 在A 的初始调用中创建,B的静态链接(实线箭头)指向之前的框架 调用。 B在其print语句中使用该调用的I实例,输出为1。
问题在于,正在运行的程序可能具有在递归子例程中声明的对象的多个实例。用语言封闭 静态作用域在关闭时捕获每个对象的当前实例 被建造。 当调用闭包的子例程时,它将找到这些捕获的实例,即使随后通过递归调用创建了更新的实例。
所以基本上,引用试图解释下面的程序(与截图中的程序相同)打印出1
:
def A(I, P):
def B():
print(I)
# body of A:
if I > 1:
P()
else:
A(2, B)
def C():
pass # do nothing
A(1, C) # main program
我不太明白原因是什么"因为P的关闭是
在A的初始调用中创建,B的静态链接(实线箭头)指向早期调用的框架"和"当调用闭包的子例程时,它将找到这些捕获的实例"。所以我修改了示例,然后新示例打印出2
而不是1
:
def A(I, P):
def B():
print(I)
if I > 2:
P()
elif I > 1:
A(3, B)
else:
A(2, B)
def C():
pass
A(1, C)
另一个修改示例打印1
:
def A(I, P):
def B():
print(I)
if I > 2:
P()
elif I > 1:
A(3, P)
else:
A(2, B)
def C():
pass
A(1, C)
那我怎么知道哪个关闭很重要?
通常,只要函数作为参数传递给另一个函数,就会创建一个闭包吗?
感谢。