【问题标题】:global variable warning in python [duplicate]python中的全局变量警告[重复]
【发布时间】:2014-01-14 02:31:14
【问题描述】:

我有一个 python 2.6 脚本(是的,我知道我应该至少升级到 2.7),如下所示:

ret_code = 0

def some_func()
  global ret_code
  ...

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

现在,如果我运行代码,我会收到警告: *SyntaxWarning: name 'ret_code' is assigned to before global declaration global ret_code*

为什么我会收到此警告?

我可以这样解决问题:

def some_func()
      global ret_code
      ...

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

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

【问题讨论】:

  • 你为什么要在if __name__ == '__main__':块中写global ret_code
  • 错误信息中说明的原因是错误的。在分配任何东西之前,必须将变量声明为全局变量。实际上,您不需要在模块级别声明名称global,因为它们已经是这样了。只有在为函数/方法赋值之前才需要它——所以只需删除if __name__ == '__main__': 语句之后的声明(这就是@delnan 他的评论的意思)。
  • 问题是不能在同一个作用域内多次使用global
  • 我建议重新打开这个问题,因为这个问题的具体答案(在if __name__ == '__main__' 下面使用global 与链接的问题或其答案无关。此外,其他问题比这个问题更草率并且代表了比这个问题更基本的 Python 误解。我的建议是将这个问题重命名为 Global variable warning in Python when using the 'global' keyword beneath the test for '__main__'
  • 是的,正如@DanNissenbaum 所说,它是关于在“if name == 'main'”中使用“global”。这不是重复的。

标签: python python-2.7 global python-2.6


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢!我的程序是一个独立的脚本。感觉使用全局变量会省去写一些 if 语句。
猜你喜欢
  • 2017-06-02
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
  • 2015-08-19
  • 1970-01-01
  • 1970-01-01
  • 2022-01-28
  • 1970-01-01
相关资源
最近更新 更多