2013-08-18 126 views
4

我試過看過幾個不同的例子,但我不確定爲什麼這不起作用。說我有這樣的代碼:Python方法中的執行順序

def loadVariable(): 
    global count 
    count = 0 

def loadDictionary(): 
    location = 'some location' 
    global myDict 
    myDict = pickle.load(open(location, 'rb')) 

def main(): 
    loadVariable() 
    loadDictionary() 
    for item in myDict: 
     if item.startswith("rt"): 
      count += 1 
      item = item[3:] 

if __name__ == '__main__': 
    main() 

在我眼中,執行if語句啓動main()方法。然後,加載全局變量,加載字典並執行for循環。

但是,當我運行代碼時,我被告知局部變量計數在賦值之前被引用。爲什麼會發生?

編輯(解釋一些我已經寫在註釋中的東西):

這不工作(雖然我認爲這是因爲全球採用錯在這裏):

global count 

def loadVariables() 
    count = 0 

def main(): 
    loadVariables() 
    rest of code etc 

這也不起作用:

def loadVariables() 
    count = 0 

def main(): 
    global count 
    loadVariables() 
    rest of code etc 

到目前爲止,我得到它的唯一辦法是使用上面提供的鏈接,這是對待th Ë算作一個列表,像這樣:

def loadVariables(): 
    global count 
    count = [0] 

def main(): 
    loadVariables(): 
    rest of code etc 
     count[0] += 1 
+0

有沒有變量稱爲'任何地方count'一個簡單的例子。我認爲你誤解了「全球化」的運作方式。 –

+0

@PhillipCloud不,那部分工作正常。 'loadVariable'創建一個全局變量'count','loadDictionary'創建一個全局變量'myDict'。 – delnan

回答

4

global意味着含有global聲明函數內,在global聲明的名稱指的是一個全局變量。這並不意味着「這件事是一個全球變量,把它當作全球性的東西。」在main中,名稱countmyDict指的是局部變量,因爲main沒有聲明它想要使用全局變量。

+0

所以還有一個問題。如果我把「global count」放在主方法的頂部,然後使用loadVariable()方法來執行:「count = 1」,爲什麼它仍然返回相同的錯誤? –

+0

@AndrewMartin:你可能從'loadVariable'中刪除'global'聲明,在這種情況下'count = 1'分配給一個局部變量'loadVariable'。變量的範圍完全不受被稱爲當前函數的函數的影響; 'main'中的'global count'不會影響'loadVariable'。 – user2357112

+0

所以我需要引用全球在主要和負載變量? –

2

的問題是,你不聲明countmain功能的全局變量,所以編譯器看到時,你是(最終)分配給它它假定它是一個局部變量。由於它的值是在分配之前讀取的,因此會發生異常。

所以,最基本的修復方法是在main()的頂部添加global count,但我認爲避免使用全局變量將是更好的選擇。爲什麼不讓loadVariableloadDictionary返回結果,而不是將它們分配給全局變量?如果在main()中你的確做了count = loadVariable(),count將會是一個局部變量,並且在稍後嘗試重新分配它時你沒有問題。

+0

原因是因爲我簡化了這個例子。實際上,在該方法中加載了七個或八個變量。我確實嘗試將全局計數添加到方法的頂部,並在loadVariables()內執行count = 0,但仍然出現錯誤。 –

+1

那麼,發佈所有的代碼。如果您對@Blcknght所建議的更正提供給您發佈的更正,則它可以正常工作。 –

+0

@MarioRossi:剛剛發佈了 –

0

這裏有一個如何global工作

global_var = 0 

def updater(): 
    global global_var 
    global_var += 1 


def stuff(x): 
    updater() 
    return global_var + x 

if __name__ == '__main__': 
    stuff(2) # returns 3