2010-07-13 81 views
5

我有一個全局變量,我稱爲Y_VAL,它被初始化爲2的值。爲什麼python認爲這是一個局部變量?

然後我有一個函數,稱爲f()(爲了簡潔),它使用Y_VAL。

def f(): 
    y = Y_VAL 
    Y_VAL += 2 

但是,試圖運行我的代碼的時候,蟒蛇提供錯誤消息:

UnboundLocalError: local variable 'Y_VAL' referenced before assignment 

如果我刪除最後一行Y_VAL += 2它工作正常。

爲什麼python認爲Y_VAL是一個局部變量?

+0

可能的重複[爲什麼我不能在Python中設置全局變量?](http://stackoverflow.com/questions/1281184/why-cant-i-set-a-global-variable-in-python ) – Mark 2012-05-12 12:18:40

回答

14

您在函數內部缺少行global Y_VAL

Y_VAL在賦值的右側出現時,由於先搜索本地作用域,然後搜索全局作用域,這沒有問題。但是,在左側,當您明確聲明global Y_VAL時,只能將指定爲

the docs

這將是不可能分配到一個全局變量沒有全球性的,但自由變量可參考全局而不被聲明爲全局。

+0

這種行爲是否適用於不同的字典?我發現我可以聲明一個全局的字典,然後在不使用'global'的情況下在一個函數內賦值它......你可能知道這背後的推理嗎? – VMDX 2010-07-13 22:14:10

+0

嗯,它看起來像我有與VMDX相同的問題。給定一個全局字典'd',我可以在不使用關鍵字global的情況下添加/更改它。這是怎麼回事?與列表相同 – Paul 2010-07-13 22:15:56

+0

您可以更改列表或字典中的內容*。您不能更改(重新綁定)對列表/字典的引用。所以'd [2:] = 3'確定,但'd + = [3]'不是。 – bobince 2010-07-13 22:19:53

1

這就是Python的工作原理:作業始終綁定最近的名稱空間中的左側名稱。函數內部最接近的名稱空間是函數的本地名稱空間。

爲了分配給一個全局變量,你必須聲明它爲global。但是一定避免global。全局變量幾乎總是不好的設計,因此使用關鍵字global是一個強烈的暗示,你正在犯設計錯誤。

0

在意識到需要全局聲明之前,我遇到了與您一樣的問題,以及其他像您一樣的問題。然後我決定把所有的東西都移到面向對象的位置,並且有一絲心意。叫我瘋了,但我只是不相信自己的全球聲明,並不難以反對本地範圍的問題,這是一個調試的痛苦。

所以我會建議收集所有的「全局」變量,把它們放在init(自我)裏面的一個類中,而不僅僅是你不必擔心局部範圍,但你會讓你的代碼組織得更好。它不是運氣的怪胎,大多數程序員都喜歡OOP。

相關問題