2013-08-18 50 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