python中的全局变量警告

who*_*iac 44 python global python-2.6 python-2.7

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

ret_code = 0

def some_func()
  global ret_code
  ...

if __name__ == '__main__':
  global ret_code
  ...
Run Code Online (Sandbox Code Playgroud)

现在,如果我运行代码,我会收到警告:*语法警告:名称'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
  ...
Run Code Online (Sandbox Code Playgroud)

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

lvc*_*lvc 92

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

这也解释了为什么它是一个错误:将变量声明为global,你不允许以前在同一范围内使用该变量名称(可能是因为转到全局变量之前,global语句会让分配混乱),并且Python不支持在同一范围内同名全局和本地).由于没有引入新的范围,第一项任务与全球声明的范围相同; 但是全局声明比赋值更晚,这是不允许的.ifret_codeif

为了获得更好的修复,请考虑是否可以完全从程序中删除可变全局状态,因为它通常会导致更多问题,而不是它在某个地方的价值.在这里,您似乎可能正在使用ret_code程序退出代码 - 也就是说,您将在sys.exit(ret_code)某处执行 - 但您正在决定使用退出代码的函数内部.取而代之的是,通过足够的信息反馈出来的顶级代码,决定使用哪个出口代码.