我如何理解Python中的这个深层绑定示例?

时间:2017-08-25 00:00:29

标签: python functional-programming closures programming-languages computer-science

来自Programming Language Pragmatics by Scott

enter image description here

  

图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)

那我怎么知道哪个关闭很重要?

通常,只要函数作为参数传递给另一个函数,就会创建一个闭包吗?

感谢。

0 个答案:

没有答案