這個問題是關於a question about Python variable scope的後續行動。其他問題q1,q2和answers可以在SO上找到,甚至更多。 官方Python documentation和PEP 3104應該解釋的細節,但他們似乎不完全自我解釋給我。Python的非本地依賴於層次結構的級別?
我試圖解決的主題是通過將代碼向上/向下移動一層的層次結構來重構包含nonlocal
/global
的代碼。
什麼我不明白是這句話從Python參考的意義:
Names listed in a nonlocal statement, unlike to those listed in a global statement, must refer to pre-existing bindings in an enclosing scope (the scope in which a new binding should be created cannot be determined unambiguously).
鑑於全球範圍內將以下代碼:
var = 0
def outer():
global var # line A
var = 1
def inner():
nonlocal var # line B
var = 2
print('inner:', var)
inner()
print('outer:', var)
outer()
print('main:', var)
執行引發錯誤:
SyntaxError: no binding for nonlocal 'var' found
該代碼工作(使用不同的語義,當然,如果有一個線A註釋:
inner: 2
outer: 2
main: 0
或線B被註釋:
inner: 2
outer: 1
main: 1
然而,在上面的例子中,由於nonlocal
應該結合VAR到「封閉範圍「,我會預料到行A將外部/ var綁定到全局範圍,然後行B查找外部/ var,並將內部/ var重新綁定到global/var。相反,它似乎根本找不到它(由於A線的重新綁定,我想),並提出錯誤。
期望的結果我的預期是:
inner: 2
outer: 2
main: 2
這是在Python作用域的頭腦的混亂狀態只是一個例子?
或者,使這個建設性的問題:
- 試問,這樣的例子在某種程度上被寫入,它不無論在哪個級別的功能所在(其與
nonlocal
,反之亦然交換global
)? - 如果函數駐留在中間級別和未知級別,那麼
outer()
的作者如何更改代碼,即最外層(在本例中爲全局)級別和級別都不必觸及的代碼? -
在我對語言的謙卑理解中,像這樣的構造(依賴於閉包)只是可以避免的。其他人已經建議使用其他語言功能(classes,func attrs)來實現這種上下文敏感性。
全局和局部變量在Python中有着根本性的不同。 'nonlocal'語句只能引用一個封閉範圍的局部變量,而不能引用全局變量 - 這就是'global'的用處。 「全球」和「非本地」背後的概念有很大不同。你目前的狀態應該是一個問題的論點是完全構建的。我的答案是:不要使用全局變量,也不要使用'global',並且所有提到的「問題」(以及其他一些問題)都將消失。 –
雖然我通常同意避免使用全局變量,但其他人似乎發現這個概念非常有用,Python提供了'global'關鍵字,Py3k甚至添加了'nonlocal'。我試圖瞭解他們聯合使用的含義。 – cfi
「...... Py3k甚至增加了一個」nonlocal「。」 'nonlocal'旨在使閉包更有用。它與全局變量無關。 –