【问题标题】:How to check if a global variable exists and if not then define it as global?如何检查全局变量是否存在,如果不存在则将其定义为全局变量?
【发布时间】:2024-01-11 06:31:01
【问题描述】:

我想做:

if var not in globals():
     global var
     var = -1

try : var
except NameError :
    global var
    var = -1

问题是:

global var
^
SyntaxError: name 'var' is used prior to global declaration

那么可以做些什么来达到类似的效果呢?


编辑:

这不是在模块级别,而是在函数中。该变量应该存储函数使用和更新的位置值,但需要在调用之间保持不变。

我已经知道上述代码是不好的做法,我同意,如果可能的话,请那些同意的人提出替代的“好的做法”方法。


编辑 2:

这个问题是帮助我修复my previous question所必需的。 在那里,obj_cnt 在每次调用时都会被重置,从而通过“索引”(一种抽象)来调试从腌制文件中访问对象的函数,因为我试图通过按排序顺序查询索引来避免不必要的查找和读取。

以上内容应该澄清“为什么?”部分。


编辑 3:

我最终不需要做这些令人费解的事情。 我使用类solved上述问题。

不过,感谢所有在这里帮助过我的人。

【问题讨论】:

  • 此代码在模块级别运行。您想在函数或模块级别执行此操作吗?
  • @juanpa.arrivillaga 那么请随意忽略这个问题并回答一些更值得你花时间的东西。感谢所有的帮助。
  • 这不是关于是否值得我花时间,而是关于指出不良做法和反模式。
  • 比起使用全局状态,拥有一个带有实例变量的类实例可能更有意义,或者使用生成器和yield,或者只是传递一个参数(不清楚你为什么不这样做)不想那样做)。
  • @tdelaney 是的,我认为单例就是因为这个原因很糟糕 - 它基本上是模糊的、可变的全局状态。

标签: python syntax-error global-variables variable-declaration python-3.9


【解决方案1】:

更改全局变量被认为是不好的做法(请参阅Why are global variables evil?,但为了知识起见,您可以这样做:

if 'var' not in globals():
     globals()['var'] = var
     var = -1

对于你正在尝试做的事情。

【讨论】:

  • 这完全是错误的——它试图将名为var的全局变量设置为名为@9​​87654324@的局部变量的当前值,然后将局部var设置为-1,将全局 var 设置为本地 var 的旧值。
  • 很可能,它会因 UnboundLocalError 而失败,因为本地 var 没有以前的值。
  • @user2357112supportsMonica 显然,var 是函数的参数。
  • @juanpa.arrivillaga 不是
【解决方案2】:

global 关键字不会单方面将变量名声明为模块级变量。它在函数中用于声明对变量的赋值应该在模块命名空间而不是函数实例命名空间中。 global 关键字在模块级别没有意义,因为模块命名空间已经是变量赋值的地方。

所以,把全局排除在外。

try:
    var
except NameError:
    var = 1
print(var)

在一个函数中你需要全局,但它需要在第一次使用之前。

def foo():
    global var
    try:
        var += 1
    except NameError:
        print("making var")
        var = 1
    return var

print(foo())
print(foo())

输出

making var
1
2

【讨论】: