在我研究装饰时,我注意到一些奇怪的事情:
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'??
答案 0 :(得分:3)
由于a
和b
具有相同的外部范围,因此msg
绑定到'bb'
。如果您希望它们具有单独的范围,请将它们放在单独的函数中。
答案 1 :(得分:1)
a
和b
都具有对外部作用域(f
的本地作用域)的读取权限。当您覆盖msg
的值时,稍后对a
/ b
的调用将会读取新值。