很容易知道如何将一个全局变量赋值给一个内部函数 - 这将使全局变量本身等于内部函数 - 但是解释器如何知道如何通过使用代码从内部函数调用一个参数下面?
def outer(arg):
def inner(arg2):
print(arg, ',', arg2):
return inner
a = outer(‘outer arg’)
print(a) # .inner at 0x109bd0048
a('inner arg') # Output: outer arg, inner arg
做print(a)
,我们看到变量/函数a
成为内部函数。
我不明白的是,如何将a
变量赋值给外部函数,使用代码a(‘inner argument’))
来定位内部函数和参数
它是否以某种方式隐式调用内部函数而没有明确说明它?
它是做这样的事情:
a = outer('outer arg')inner('inner arg')
这个魔法背后的python源代码在哪里?
我没有足够的评论声誉,所以我必须写一个答案......
来自Luciano Ramalho出色的“Fluent Python”:
“... Python在__code__属性中保留了本地和自由变量的名称,代表了函数的编译体”
“总结一下:闭包是一个函数,它保留定义函数时存在的自由变量的绑定,以便以后在调用函数时使用它们,并且定义范围不再可用”
我在你的代码中添加了几行来可视化:
def outer(arg):
def inner(arg2):
print(arg, ',', arg2)
print (inner.__code__.co_freevars)
print (inner.__closure__[0].cell_contents)
return inner
其中打印以下内容:
In [169]: outer('outer arg')
('arg',)
outer arg
因此,您可以看到,即使函数超出范围,arg的值也会保留,因为它是一个自由变量。 arg的绑定保存在__closure__属性中。
这只是进一步阅读的暗示,我绝不是专家。