4

我试过看几个不同的例子,但我不确定为什么这不起作用。假设我有一些这样的代码:

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 循环。

但是,当我运行代码时,我被告知在分配之前引用了局部变量 count。为什么会这样?

编辑(解释我在评论中写的一些东西):

这不起作用(尽管我认为这是因为 global 在这里使用错误):

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

到目前为止,我让它工作的唯一方法是使用上面提供的链接,即将计数视为一个列表,如下所示:

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

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

3 回答 3

4

global意味着在包含声明的函数中, global 声明中的名称global指的是一个全局变量。这并不意味着“这个东西是一个全局变量;在任何地方都把它当作全局变量。” 在main中,名称countmyDict引用局部变量,因为main没有声明它要使用全局变量。

于 2013-08-18T01:09:31.280 回答
2

问题是你没有count在函数中声明为全局变量main,所以当编译器看到你(最终)分配给它时,它假定它是一个局部变量。由于它的值是在分配之前读取的,因此您会遇到异常。

因此,最基本的解决方法就是global count在 顶部添加main(),但我认为避免使用全局变量会是更好的选择。为什么不拥有loadVariableloadDictionary返回他们的结果,而不是将它们分配给全局变量?如果main()你这样做了count = loadVariable(),count 将是一个局部变量,你以后尝试重新分配它就没有问题了。

于 2013-08-18T01:07:24.533 回答
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
于 2013-08-18T01:24:23.370 回答