2017-09-28 33 views
0

對此類似的問題已經提出並回答,但沒有涉及這個具體問題。針對全局變量賦值的Python語法警告

global EXAMPLE_GLOBAL 
EXAMPLE_GLOBAL = True 


def Setup(): 
    if EXAMPLE_GLOBAL: 
     try: 
      #Doing some file io here 
     except: 
      global EXAMPLE_GLOBAL 
      EXAMPLE_GLOBAL = False 

當運行這段代碼(不是這個代碼完全是,這只是剝離下來的基本邏輯),我得到:

SyntaxWarning:名稱「EXAMPLE_GLOBAL」是用來之前全局聲明 global EXAMPLE_GLOBAL

我的印象是,要改變一個全局變量的值,你必須首先指定當你到一個新的作用域時引用全局變量。我是否需要第二個「全局EXAMPLE_GLOBAL」來更改全局或使用相同的標識符?

+0

把'在第一行全球EXAMPLE_GLOBAL' ''Setup()'擺脫警告 –

+0

它警告你'EXAMPLE_GLOBAL'的一些用法在函數內的'global'聲明之前。如果'global EXAMPLE_GLOBAL'在你的函數的開頭,你的代碼會更清晰。 – khelwood

回答

2

我的印象是,改變你必須先指定你被引用的全局變量當你去到一個新的範圍

是一個全局變量的值下,這是正確的。但傳統上,全球聲明應該在該範圍的開頭。換句話說,把它放在你的函數的頂部。

EXAMPLE_GLOBAL = True 

def Setup(): 
    global EXAMPLE_GLOBAL 
    if EXAMPLE_GLOBAL: 
     try: 
      #Doing some file io here 
     except: 
      EXAMPLE_GLOBAL = False 

documentation明確建議反對在一個全球性的語句中使用它之前提到一個名字塊:

名稱在全局聲明中列出的不能在同一個代碼塊文本上之前被使用該全球聲明。

在CPython中,違反此原則只會產生警告而不是錯誤,因爲解析器會忽略塊內全局僞指令的具體位置,但這是實現細節,將來可能會更改。

(另請注意,您不需要在第一行的global聲明。在頂級範圍的每個名字已經在該範圍內有效的全球)。

+0

你真了不起,謝謝。在你的筆記中你是否說過,在頂層scope聲明的所有全局變量不需要在較低範圍重新指定?因爲我正在編寫的這個程序有10多個全局變量,我正以類似的方式使用它。 – Alexzoin

+0

_「你是說在頂層範圍聲明的所有全局變量不需要在較低範圍重新指定」_我是說相反:在較低範圍的全局變量不需要在頂部聲明*級別範圍。不在函數/類/ etc定義中的'global'語句實際上是無用的。全球聲明有效地表示「雖然我們處於此範圍內,請將此名稱視爲處於頂級範圍」,但如果您已處於頂級範圍內,則不會改變任何內容。 (*和「聲明」我的意思是「放在'全局'聲明中,而不是」最初分配給「) – Kevin