很容易知道如何将一个全局变量赋值给一个内部函数 - 这会使全局变量本身就是一个与内部函数相等的函数 - 但是解释器如何知道如何调用一个内部函数使用下面的代码?
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)
,我们看到变量/ function a
成为内部函数。
我不明白的是,如何将a
变量分配给外部函数,如何使用代码a(‘inner argument’))
是否以某种方式隐式调用内部函数而没有明确说明它?
它是否正在做这样的事情:
a = outer('outer arg')inner('inner arg')
这个魔术背后的python源代码在哪里?
答案 0 :(得分:0)
我没有足够的评论声誉,所以我必须写一个答案......
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__属性中。
这只是进一步阅读的暗示,我绝不是专家。