python中的全局变量警告

时间:2013-12-26 12:20:44

标签: python python-2.7 global python-2.6

我有一个python 2.6脚本(是的,我知道我应该升级到至少2.7),看起来像这样:

ret_code = 0

def some_func()
  global ret_code
  ...

if __name__ == '__main__':
  global ret_code
  ...

现在,如果我运行代码,我会收到警告: *语法警告:名称'ret_code'在全局声明全局ret_code *

之前分配

为什么我会收到此警告?

我可以通过这样做解决问题:

def some_func()
      global ret_code
      ...

if __name__ == '__main__':
  global ret_code
  ret_code = 0 #assign 0 here instead of above
  ...

仍然没有回答我的问题。原始代码有什么问题?

1 个答案:

答案 0 :(得分:88)

解决此问题的最佳方法是从global下方删除if __name__ == '__main__':声明。你不需要那里。与其他一些语言不同,if语句不会在Python中引入新的范围 - 您在该块中分配的任何变量都是全局的,就像它们没有if那样。

这也解释了为什么它是一个错误:将变量声明为global,你不允许以前在同一范围内使用该变量名称(可能是因为它会让{{1}混淆在之前进行赋值的语句转到全局变量,并且Python在同一范围内不支持同名全局和本地)。由于global未引入新范围,因此if的第一个分配与ret_code下的全局声明的范围相同;但全局声明的时间晚于作业,这是不允许的。

为了获得更好的解决方案,请考虑是否可以完全从程序中删除可变全局状态,因为它通常会导致更多问题,而不是它在某个地方的价值。在这里,您似乎可能使用if作为程序退出代码 - 也就是说,您将在某处执行ret_code - 但您正在决定使用退出代码的函数内部。相反,将足够的信息传递回 it 的顶级代码,以决定使用哪个退出代码。