2012-09-17 70 views
1

有人可以解釋怎麼在這裏python全局變量,這是怎麼回事?說明需要

x = 10 
def foo(): 
    print "x in foo = ",x 
    if x: x = 8 -------------> mysterious line 

foo() 
print "x in main = ",x 

事情在上面的代碼,如果我註釋掉神祕的線(如X:X = 8)

我得到的輸出

x in foo = 10 
x in main = 10 

否則我結束了錯誤

"UnboundLocalError: local variable 'x' referenced before assignment"

爲什麼這樣的嗎?

我知道global x僅當我需要在本地修改全局變量時纔有用。

+3

但是,您*本地修改'x'。 –

+0

當函數「編譯」時,函數中哪些範圍可用的變量會被確定。也就是說,在'foo()'中間變量不能從全局變爲局部。 – millimoose

回答

5

只要您在函數的任何位置對x進行賦值,即使在賦值之前引用了它的值,它也會成爲局部變量。

3

在你的函數中,你分配給x而沒有global聲明,所以x是一個局部變量。但是,在嘗試在函數分配給它之前嘗試讀取x,因此您在該點處具有未綁定的本地。

2

什麼可以乍看奇怪的是,當地名稱是靜態檢測:如果名稱x分配在函數的任何位置,Python的假設x是本地名稱,到處的功能。

換句話說,在你的函數的線序是一種誤導:只要x在函數某處分配,第一行的x成爲一個局部變量(這在這個代碼點仍是未綁定)的引用。

+0

我還有一個疑問,如果「Python假設x是一個本地名稱無處不在的函數」,那麼爲什麼locals()在下面的代碼中不會打印「x」作爲本地變量012 ffl(0) x = 10 def foo : 打印當地人() 打印 「foo中X =」 時,X 如果X:X = 8 FOO() 打印 「在主= X」,X – naren

+0

@narendra_l:'當地人()'只返回實際上在本地名稱空間中綁定名稱;解釋器知道該名稱空間中的名稱在編譯時只能是本地的,即使它在運行locals()時沒有綁定。 – geoffspear

+0

@Wooble:你的意思是'x'在編譯器執行locals()時不受局部命名空間限制? – naren

1

就像Wooble已經說過的,你需要在使用前聲明一個全局變量的修飾。

def foo(): 
    global x 
    print "x in foo = ",x 
    if x: x = 8 
0

x = 8在函數的任何位置,而不global x使得它的局部變量。 print x因局部變量未初始化而失敗