【问题标题】:global variable doesn't work when I use exec使用 exec 时全局变量不起作用
【发布时间】:2021-07-23 04:24:00
【问题描述】:

每当我使用以下 sn-p 执行我的代码时,它都可以正常工作。

def set_globvar_to_one():
    global globvarq
    globvarq = 2

def print_globvar():
    print(globvarq)

set_globvar_to_one()
print_globvar()

但是,就我而言,我需要使用 exec 命令执行这个 sn-p,因为我的代码是动态的。 所以,我尝试了以下。

def set_globvar_to_one():
    exec(compile("global globvarq","setglobal","exec"))
    exec(compile("globvarq = 2","setglobal","exec"))
def print_globvar():
    eval(compile("print(globvarq)","setglobal","eval")) 

set_globvar_to_one()
print_globvar()

这段代码抛出以下错误。

Traceback (most recent call last):
    print_globvar()
    eval(compile("print(globvarq)","setglobal","eval"))
  File "setglobal", line 1, in <module>
NameError: name 'globvarq' is not defined

如何使一个方法中的变量成为全局变量,并在另一种方法中使用相同的变量?

【问题讨论】:

  • 我不确定为什么会失败,但我可以指出编译和执行 global 语句本身是完全没用的——它对单独编译的语句没有任何影响.

标签: python methods exec eval global


【解决方案1】:

我不确定您实际上想要实现什么,但这符合您的预期:

def set_globvar_to_one():
    exec(compile("global globvarq\nglobvarq = 2", "setglobal", "exec"))


def print_globvar():
    eval(compile("print(globvarq)", "setglobal", "eval"))


set_globvar_to_one()
print_globvar()

【讨论】:

  • 这按我的预期工作。但是,为什么我的代码不起作用?两者对我来说都一样:/
  • 一个关键的区别是第一个函数中的两行是一段代码,因此在彼此的上下文中执行 - globvarq 在第二个 exec() 语句中不是全局的, “全局”不是值的属性,而是引用值的本地名称的属性。
猜你喜欢
  • 2013-07-13
  • 2016-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-12
相关资源
最近更新 更多