標籤:
先看下面這段代碼,顯然無法work. 因為代碼試圖在TestVariableScope()中引用一個沒有被定義的變數a.所以必須報錯,如-1.
不過如果你將第2行代碼注釋掉。代碼就能跑通了,-2。
問題1來了:TestVariableScope.a 不是也沒有被定義嗎,為什麼可以work呢?解釋如下:先看代碼第8行,TestVariableScope.a在SetVariable方法中被定義了,SetVariable()又 在TestVariableScope()前被調用。所以TestVariableScope()在被調用的時候TestVariableScope.a已經被定義了。
問題2來了:代碼第7行,a也被定義了。為什麼TestVariableScope()在引用a是報錯呢。區別在於:a 只是SetVariable()中的一個local變數,TestVariableScope當然無法引用SetVariable中定義的局部變數了。因為違反了LEGB原則嗎。TestVariableScope.a 就不一樣了,他是一個全域變數哦。所以TestVariableScope當然可以訪問這個全域變數了,完全不違反LEGB原則。
問題3來了:為什麼TestVariableScope.a是個全域變數,而a卻不是呢。因為python中函數皆是對象,而且是全域對象。TestVariableScope.a其實就是TestVariableScope這個全域對象下的一個變數而已,自然也是全域變數嘍。 見圖-3
1 def TestVariableScope(): 2 print(a) 3 print(TestVariableScope.a) 4 TestVariableScope.a=13 5 6 def SetVariable(): 7 a=12 8 TestVariableScope.a=12 9 10 if __name__==‘Demo‘:11 print(‘Demo is running‘)12 13 if __name__ == ‘__main__‘:14 SetVariable()15 TestVariableScope()16 b=TestVariableScope17 b()
圖-1
圖-2
圖-3
Python中通過函數對象建立全域變數