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不支持在同一范围内同名全局和本地).由于没有引入新的范围,第一项任务与全球声明的范围相同; 但是全局声明比赋值更晚,这是不允许的.if
ret_code
if
为了获得更好的修复,请考虑是否可以完全从程序中删除可变全局状态,因为它通常会导致更多问题,而不是它在某个地方的价值.在这里,您似乎可能正在使用ret_code
程序退出代码 - 也就是说,您将在sys.exit(ret_code)
某处执行 - 但您正在决定使用退出代码的函数内部.取而代之的是,通过足够的信息反馈出来的顶级代码,它决定使用哪个出口代码.
归档时间: |
|
查看次数: |
41350 次 |
最近记录: |