簡體   English   中英

python的全局關鍵字如何工作?

[英]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.

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