我有一个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
...
仍然没有回答我的问题。原始代码有什么问题?
答案 0 :(得分:88)
解决此问题的最佳方法是从global
下方删除if __name__ == '__main__':
声明。你不需要那里。与其他一些语言不同,if
语句不会在Python中引入新的范围 - 您在该块中分配的任何变量都是全局的,就像它们没有if
那样。
这也解释了为什么它是一个错误:将变量声明为global
,你不允许以前在同一范围内使用该变量名称(可能是因为它会让{{1}混淆在之前进行赋值的语句转到全局变量,并且Python在同一范围内不支持同名全局和本地)。由于global
未引入新范围,因此if
的第一个分配与ret_code
下的全局声明的范围相同;但全局声明的时间晚于作业,这是不允许的。
为了获得更好的解决方案,请考虑是否可以完全从程序中删除可变全局状态,因为它通常会导致更多问题,而不是它在某个地方的价值。在这里,您似乎可能使用if
作为程序退出代码 - 也就是说,您将在某处执行ret_code
- 但您正在决定使用退出代码的函数内部。相反,将足够的信息传递回 it 的顶级代码,以决定使用哪个退出代码。