[英]How does python's global keyword work?
import json
def test():
print json.dumps({'k': 'v'})
import json
if __name__ == '__main__':
test()
會拋出異常:
UnboundLocalError: local variable 'json' referenced before assignment
添加global
關鍵字
import json
def test():
global json
print json.dumps({'k': 'v'})
import json
if __name__ == '__main__':
test()
有用。
在函數中對名稱的任何分配都會使該名稱在該函數本地。 賦值在函數中的哪個位置都沒有關系,即使它是函數中的最后一條語句:名稱對於函數也是本地的。 如果在分配給本地名稱之前使用本地名稱,則會看到錯誤。
該名稱也可以在全局范圍內使用。 編譯器知道該名稱是本地名稱,並且只會在本地范圍內查找它。
導入語句是一種賦值形式。 您在函數中的“ import json”語句使名稱“ json”在函數本地。 在將名稱導入本地之前,您正在使用該名稱,因此您在使用未綁定的本地。
“全局”語句意味着,即使在賦值語句中使用了此名稱,它也不是本地名稱,而是全局名稱。 在第二個函數中,全局語句使名稱“ json”引用全局“ json”,在您嘗試訪問它時已經定義了它,因此函數可以正常工作。
python在首次解析功能代碼並確定json
是局部變量時會看到import json
語句。 (如果您分配給json
也會發生同樣的事情-例如json = 'Hello World!'
)。 執行表達式json.dumps
,python在本地范圍內查找json
,但找不到它(因此是例外)。
在第二種情況下,當您添加global
,在解析函數時,您要告訴python始終在全局范圍內查找json
。 就您而言,它已經存在,因為您已經導入了它,所以一切都很好。 它還告訴python, json
任何賦值(或導入)都應在全局范圍而非本地范圍中存儲名稱(和關聯的值)。
在Python中,存在局部(默認)和全局上下文。 每個函數都會分別初始化一個新的本地上下文,當函數啟動時,它為空。 全局上下文是全局的,並且(幾乎)由模塊的每個部分共享。
通過使用全局指令,可以從全局上下文中導入變量,從而防止在本地變量中查找符號(該符號為空,否則將失敗)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.