python嵌套函数中的变量范围

时间:2010-10-14 09:50:04

标签: python scope

在我研究装饰时,我注意到一些奇怪的事情:

def f():
...     msg='aa'
...     def a():
...             print msg
...     msg='bb'
...     def b():
...             print msg
...     return a,b
... 
>>> a,b = f()
>>> a()
bb
>>> b()
bb
>>> 

为什么a()返回'bb'而不是'aa'??

2 个答案:

答案 0 :(得分:3)

由于ab具有相同的外部范围,因此msg绑定到'bb'。如果您希望它们具有单独的范围,请将它们放在单独的函数中。

答案 1 :(得分:1)

ab都具有对外部作用域(f的本地作用域)的读取权限。当您覆盖msg的值时,稍后对a / b的调用将会读取新值。