我正在阅读有关装饰器的 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/

10-12 18:31