簡體   English   中英

為什么python認為這是一個局部變量?

[英]Why does python think this is a local variable?

我有一個名為Y_VAL的全局變量,它被初始化為值2。

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

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

但是,在嘗試運行我的代碼時,python會給出錯誤消息:

UnboundLocalError: local variable 'Y_VAL' referenced before assignment

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

為什么python認為Y_VAL是局部變量?

你錯過了函數內部的global Y_VAL行。

Y_VAL出現在賦值的右側時,沒有問題,因為首先搜索局部范圍,然后搜索全局范圍。 但是,在左側,只有在顯式聲明global Y_VAL時,才能以這種方式分配 global Y_VAL

來自文檔

沒有全局變量就不可能分配給全局變量,盡管自由變量可以引用全局變量而不被聲明為全局變量。

這就是Python的工作原理:賦值總是綁定最近的名稱空間中的左側名稱。 在函數內部,最近的命名空間是函數的本地命名空間。

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

在遇到需要全局聲明之前,我遇到了和你以及許多其他人一樣的問題。 然后,我決定將所有內容都移到面向對象的位置,並且有一點心思。 叫我瘋了,但我不相信自己的全局聲明,並且不難發現本地范圍的問題,這是一個很難調試的問題。

因此我建議收集所有“全局”變量,將它們放在init (self)中的一個類中,不僅你不必擔心局部范圍,而且你的代碼組織得更好。 大多數程序員都不喜歡OOP,這不是一個好運的怪物。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM