0

我已阅读无法通过 exec() 语句更改函数中的全局变量?,但这不是我的情况。

当我运行时test(),它会引发异常UnboundLocalError: local variable 'var' referenced before assignment,看起来好像exec('global var', globals())不起作用。

var = 1

def test():
    exec('global var', globals()) # The effect it achieves is different from `global var`, why? 
    var += 1  

test()
print(var)

但是,如果我将功能更改为以下内容,它会起作用:

def test():
    exec('global var', globals())
    exec('var += 1', globals())

不知道为什么,谁能解释一下?

4

2 回答 2

3

语言参考(“简单语句”部分)中的以下引用似乎相关:

程序员注:global 是解析器的指令。它仅适用于与全局语句同时解析的代码。特别是,提供给内置 exec() 函数的字符串或代码对象中包含的全局语句不会影响包含该函数调用的代码块,并且此类字符串中包含的代码不受包含以下代码的全局语句的影响函数调用。这同样适用于 eval() 和 compile() 函数。

即,在您的第一个版本中,var仍然是函数的本地。

于 2021-08-03T07:52:00.390 回答
1

'global var' 仅在动态创建程序 (DCP) 的上下文中有意义。

考虑这两个增加 var 的选项。他们可能会使正在发生的事情更加明显。

exec('var += 1', globals())

...或者...

exec('global var\nvar += 1')

在第一种情况下,Python 运行时会找到 var,因为您将全局字典传递给了 exec()。在第二种情况下,您将 var 限定为“global”,以便运行时知道在哪里查找。因此请注意,在第二种情况下,无需传递 globals()

于 2021-08-03T07:57:49.440 回答