我正在阅读有关装饰器的 article。
在 步骤 8 ,有一个函数定义为:
def outer():
x = 1
def inner():
print x # 1
return inner
如果我们通过以下方式运行它:
>>> foo = outer()
>>> foo.func_closure # doctest: +ELLIPSIS
它不打印 x。根据解释:
但是,我不太明白第二段是什么意思。
我知道 inner() 确实得到了 x 的值,但为什么它不打印 x 呢?
谢谢
更新 :
谢谢大家的回答。现在我明白原因了。
“ return inner ”只是指向inner()的指针,但它没有被执行,这就是inner()不打印x的原因,因为它根本没有调用
最佳答案
您不是在调用 inner
。您调用了 outer
,它返回 inner
,但没有调用它。如果您想调用 inner
,请执行 foo()
(因为您将 outer()
的结果分配给名称 foo
)。
你引用的段落与这个问题有点相关。你说你已经明白为什么 inner
得到 x
的值,这就是那一段所解释的。基本上,如果在嵌套函数中使用局部变量,并且返回该嵌套函数,则该变量的值与返回的函数一起存储,即使定义该变量的作用域不再处于事件状态。通常 x
会在 outer
完成后消失,因为 x
只是 outer
的局部变量。但是 outer
返回 inner
,它仍然需要访问 x
。所以 x
被包裹在所谓的闭包中,所以以后 inner
仍然可以访问它。
关于嵌套函数中的python变量范围,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17228396/