我试过看几个不同的例子,但我不确定为什么这不起作用。说我有一些像这样的代码:
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 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
答案 0 :(得分:4)
global
表示包含 global
声明的函数中的,global
声明中的名称指的是全局变量。它并不意味着“这个东西是一个全球变量;在任何地方都将它视为全球性的。”在main
中,名称count
和myDict
引用局部变量,因为main
未声明它想要使用全局变量。
答案 1 :(得分:2)
问题是你没有在count
函数中将main
声明为全局变量,所以当编译器看到你(最终)分配给它时,它假定它是一个局部变量。由于在分配之前读取了它的值,因此会出现异常。
所以,最基本的修复只是在global count
的顶部添加main()
,但我认为避免全局变量是更好的选择。为什么不让loadVariable
和loadDictionary
返回结果,而不是将它们分配给全局变量?如果在main()
中你做了count = loadVariable()
,则count将是一个局部变量,以后您尝试重新分配它时没有任何问题。
答案 2 :(得分: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