我剛剛學會了python @ decorator,它很酷,但很快我發現我的修改後的代碼出現了奇怪的問題。Python關閉函數丟失外部變量訪問
def with_wrapper(param1):
def dummy_wrapper(fn):
print param1
param1 = 'new'
fn(param1)
return dummy_wrapper
def dummy():
@with_wrapper('param1')
def implementation(param2):
print param2
dummy()
我調試它,它在打印參數1
UnboundLocalError: local variable 'param1' referenced before assignment
拋出異常,如果我刪除param1 = 'new'
這一行,沒有任何修改操作上的變量,從外部作用域(鏈接到新的對象),這個例程可能工作。
這是否意味着我只做了一個外部作用域變量的副本,然後進行修改?
感謝德爾南,這是至關重要的。從這裏 可能的答案: What limitations have closures in Python compared to language X closures?
類似代碼:
def e(a):
def f():
print a
a = '1'
f()
e('2')
而且也是這似乎以前討厭的全局變量:
a = '1'
def b():
#global a
print a
a = '2'
b()
通過添加全球符號,它是固定的。 但是關閉,沒有找到這樣的符號。 感謝unutbu,Python 3給了我們非本地。
我知道從上面直接訪問外層變量是隻讀的。 ,但看到前面的閱讀變量(print var)也受到影響會有點不舒服。
的[可能重複什麼限制有在Python閉包相比,語言X倒閉?](http://stackoverflow.com/questions/141642/what-limitations-have-closures-in-python-compared-to-language-x-closures) – delnan
這有絕對的無關與裝飾btw。 – delnan
是的,這發生在關閉。 這樣的: 高清E(一): DEF F(): 打印一個 A = '1' F() E( '123') –