2013-01-03 88 views
2

爲什麼以下Python工作,沒有首先在全局範圍內聲明a爲什麼Python允許您將函數內部的局部變量實例化爲全局變量?

def setA(): 
    global a 
    a = 5 

def printA(): 
    print a 

setA() 
printA() 

在我看來,這是正確的方式做到這一點:

a = None 

def setA(): 
    global a 
    a = 5 

def printA(): 
    print a 

setA() 
printA() 
+1

有什麼選擇?如果全局範圍中不存在'a'並且讓它在本地而不是'global',那麼'global'就會失敗?它應該引發異常嗎? –

+0

我的印象是全球關鍵詞的意思是「以下是指全球範圍內的變量」。 我會認爲,當你做「打印」應該有一個錯誤,該變量是未知的。 – Stewart

+2

@Stewart:這並不意味着,這意味着「現在認爲以下名稱的任何用途都在全球範圍內運行」。這個名字是否已經存在並不重要。如果分配給它並且它不在那裏,它將創建它,就像它實際上在模塊頂層分配它一樣。 – BrenBarn

回答

8

基本上是同樣的原因,a = 5工程,以創建一個新的局部變量:當你分配給一個變量, Python不關心它是否已經存在。 global聲明僅僅意味着「在此範圍內對以下名稱的任何使用現在被認爲是在全局範圍內運行」。

您可以在模塊頂層執行a = 5是否已存在或不存在a。所以你可以在函數內部做​​。 global在函數內部進行賦值就像在全局級別一樣,包括名稱是否已經存在並不重要。

+0

+1。當然,在Python 3中用'nonlocal'試試這個...(這裏的區別是'global a; a = 5'不可能是模棱兩可的 - 它有一個明顯的含義,這就是編譯器使用的含義。) – abarnert

+0

請注意,我們可以在不使用任何'global'語句的情況下修改可變全局對象。 –