gpt4 book ai didi

exec 中的 python 字典理解使用全局变量而不是局部变量

转载 作者:太空宇宙 更新时间:2023-11-03 11:54:00 24 4
gpt4 key购买 nike

我发现在 exec 和 eval 中使用字典理解和其他方法之间存在以下差异。总之,不同之处在于,当使用推导式时,变量取自全局参数,但不使用推导式的等效代码取自局部参数。

这是在 Python Software Foundation Windows 安装程序的 Python 2.7.3 中找到的。

执行以下代码时:

locals1 = {"d":{1: 'x', 2: 'y', 3: 'z'}, "test":3}
globals1 = dict(globals().items() + [("d", {1: 'a', 2: 'b', 3: 'c'}), ("test", 2)])
exec "new = {key:d[key] for key in d if key != test}" in globals1, locals1
print locals1

输出是:

{'test': 3, 'new': {1: 'a', 3: 'c'}, 'd': {1: 'x', 2: 'y', 3: 'z'}}

请注意,字典 (d) 和测试值 (test) 均取自全局参数。

当执行等效代码时:

locals2 = {"d":{1: 'x', 2: 'y', 3: 'z'}, "test":3}
globals2 = dict(globals().items() + [("d", {1: 'a', 2: 'b', 3: 'c'}), ("test", 2)])
exec "new = d.copy(); new.pop(test)" in globals2, locals2
print locals2

生成此输出:

{'test': 3, 'new': {1: 'x', 2: 'y'}, 'd': {1: 'x', 2: 'y', 3: 'z'}}

在这种情况下,字典 (d) 和测试值 (test) 都取自 locals 参数。

进一步的迹象表明,如果字典和/或测试值不在全局参数中,即使它们在局部参数中,使用理解执行代码也会失败并出现变量未找到异常。

请注意,这不是关于使用 exec 的问题,我有充分的理由使用 exec。可以使用 eval 演示相同的情况。

最佳答案

这是完全正确的;字典理解作为函数作用域执行。在该函数作用域中引用的任何未在该作用域 中定义的变量都被假定为全局变量。

如果您在 exec 编辑的代码中使用显式函数,您会得到相同的效果:

>>> locals3 = {"d":{1: 'x', 2: 'y', 3: 'z'}, "test":3}
>>> globals3 = dict(globals().items() + [("d", {1: 'a', 2: 'b', 3: 'c'}), ("test", 2)])
>>> exec "def f():\n new = d.copy()\n new.pop(test)\n return new\nnew = f()" in globals3, locals3
>>> print locals3
{'test': 3, 'new': {1: 'a', 3: 'c'}, 'd': {1: 'x', 2: 'y', 3: 'z'}, 'f': <function f at 0x106bbcaa0>}

这记录在 Displays for sets and dictionaries 中部分:

Note that the comprehension is executed in a separate scope, so names assigned to in the target list don’t “leak” in the enclosing scope.

在 Python 2.x 中,list comprehension not 有自己的范围,这在 Python 3 中已经改变了。

关于exec 中的 python 字典理解使用全局变量而不是局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18037021/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com