我发现在 exec 和 eval 中使用字典理解与其他方法之间存在以下差异。总之,不同之处在于,当使用推导式时,变量取自 globals 参数,但不使用推导式的等效代码从 locals 参数中获取变量。
这是在 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) 都取自 globals 参数。
执行等效代码时:
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 参数。
进一步的迹象是,如果字典和/或测试值不在 globals 参数中,即使它们在 locals 参数中,使用推导式执行代码将失败并出现变量未找到异常。
请注意,这不是关于使用 exec 的问题,我有充分的理由使用 exec。使用 eval 可以演示相同的情况。