【问题标题】:why can't I declare a global variable inside an "exec" string为什么我不能在“exec”字符串中声明一个全局变量
【发布时间】:2021-11-17 12:17:39
【问题描述】:

我正在尝试在 exec 字符串中声明和更改全局变量,如下所示:

ostr = "didn't work"
nstr = "worked"
def function():
    exec("global ostr; ostr = nstr")
    #global ostr; ostr = nstr
    print(ostr)
    lv='ostr' in globals()
    print(lv)
    ostr='asd'

function()

但是,在打印语句中出现以下错误:

UnboundLocalError: local variable 'ostr' referenced before assignment

但是,如果我在 exec 语句之后注释掉“exec”行并取消注释行,代码就可以正常工作。

如何使用“exec”修复此错误?我想声明全局变量并在 exec 字符串中修改这些全局变量,并使这些修改在后续行的“函数”中可见。

【问题讨论】:

  • 坦率地说,这听起来像是所有最糟糕的做法。虽然肯定有关于为什么的答案,甚至可能关于如何“修复”它……我会重新评估你在这里所做的一切的整个方法。
  • 我正在尝试在 python 中实现一个脚本。类似于 matlab 脚本。在当前工作区中执行的一些其他代码。

标签: python variables runtime-error exec global


【解决方案1】:

您必须声明您在函数中使用全局 ostr 才能打印它。这段代码输出

def function():
   global ostr
   exec("global ostr; ostr = nstr")
   #global ostr; ostr = nstr
   print(ostr)
   lv='ostr' in globals()
   print(lv)
   ostr='asd'

工作

是的

编辑:刚刚意识到 exec 实际上适用于全局变量,如果您在全局主目录中重新运行代码和 print(ostr),您将看到它已更改。

ostr = "didn't work"
nstr = "worked"
def function():
    #global ostr
    exec("global ostr; ostr = nstr")

function()
print(ostr)

工作

编辑#2:要么在修改之前将 ostr 声明为全局变量,要么将其分配给另一个局部变量。

ostr = "didn't work"
nstr = "worked"
def function():
    exec("global ostr; ostr = nstr")
    #global ostr; ostr = nstr
    print(ostr)
    lv='ostr' in globals()
    print(lv)
        
function()

工作

是的

【讨论】:

  • 你在这里提到的两件事都没有达到我的要求。正如我在原始问题中提到的那样,我意识到如果我取消注释“global ostr; ostr = nstr”,那么代码“工作”而不使用“exec”。而且我知道如果我删除“print(ostr)”那么就没有错误。我正在尝试使用 exec 来声明一些全局的东西,然后使用它。我该怎么做?
  • 好吧,我想我明白了一点。实际上是你的 ostr='asd' 抛出了错误,因为 python 认为它是一个局部变量它在本地范围内,但是您必须将其声明为全局变量才能在全局范围内对其进行修改。希望有帮助
  • Anthony1223,很明显“exec”只是忽略了“global”命令。但是您的回答为我提供了解决方法。如果我有一个单独的行(不在“exec”中)声明全局变量,那么我在“exec”中的命令似乎按预期工作。谢谢你。感谢您认真对待这个问题。很多时候,当我向 Python 寻求帮助时,人们的回答都是“不要那样做”、“你不应该那样做”或“那不是 Pythonic”。或其他一些无益的东西。
  • 您可以尝试将 globals() 传递给 exec 函数。不要担心“你做错了”的事情,当我读到你正在尝试迁移 matlab 代码时,我知道这会很烦人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 2022-11-12
  • 2011-06-22
  • 1970-01-01
相关资源
最近更新 更多