2016-02-08 188 views
0

如果這個工程合併全局和局部範圍

x=5 
def main(): 
    for globe in locals(): 
     globals().update(locals()[globe]) 
    print x 
main() 

那麼爲什麼不呢?

x=5 
def main(): 
    for globe in locals(): 
     globals().update(locals()[globe]) 
    x+=1 
    print x 
main() 

後者語句中的錯誤聲稱,x被賦值之前被引用,但它工作在第一個例子...

回答

0

你不能沒有明確這樣做分配Python中的全局變量。通過編寫x+=1您正在爲x賦值並隱式聲明x爲局部變量。但它沒有定義,因此你得到一個錯誤。

循環沒有實際效果,因爲locals字典爲空。

如果你想在Python中使用全局變量(你不應該這樣做,但那是另一回事),你應該使用global關鍵字。

1

在當你將一個變量聲明自動發生蟒蛇。 因此,當您在函數內部爲x賦值時,python認爲這是一個新的局部變量,影響全局x

,如果你想一個值分配給全球x你可以這樣做:

x=5 
def main(): 
    global x 

    x += 1 
    print x 
main() 
0

後面添加1和2的兩個功能,你可以找到本地名稱(語法在Python 2略有不同):

In [7]: main1.__code__.co_varnames 
Out[7]: ('globe',) 

In [8]: main2.__code__.co_varnames 
Out[8]: ('globe', 'x') 

所以x有不同的狀態。在第二種情況下,本地x掩蓋全局,因此x = x + 1會導致錯誤,因爲尚未定義。

docs

如果名稱是在塊的約束,它是塊的局部變量,除非聲明爲外地或全球(...)如果一個變量中使用。一個代碼塊,但沒有在那裏定義,它是一個自由變量。