我以为这会打印 3,但它打印了 1:
# Python3
def f():
a = 1
exec("a = 3")
print(a)
f()
# 1 Expected 3
原文由 ubershmekel 发布,翻译遵循 CC BY-SA 4.0 许可协议
我以为这会打印 3,但它打印了 1:
# Python3
def f():
a = 1
exec("a = 3")
print(a)
f()
# 1 Expected 3
原文由 ubershmekel 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果你在一个方法中,你可以这样做:
# python 2 or 3
class Thing():
def __init__(self):
exec('self.foo = 2')
x = Thing()
print(x.foo)
原文由 macabeus 发布,翻译遵循 CC BY-SA 4.0 许可协议
4 回答4.4k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
1 回答3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
1 回答4.5k 阅读✓ 已解决
1 回答3.8k 阅读✓ 已解决
1 回答2.8k 阅读✓ 已解决
这个问题在 Python3 错误列表 中有所讨论。最终,要获得此行为,您需要执行以下操作:
如果您查看
exec
上的 Python3 文档,您将看到以下注释:这意味着单参数
exec
不能安全地执行任何绑定局部变量的操作,包括变量赋值、导入、函数定义、类定义等。如果它使用global
它可以分配给全局变量---
声明,但不是本地人。Georg Brandl 回顾 错误报告中的特定消息 说:
重点是我的。
所以它的要点是Python3可以通过默认 不允许 这种行为来更好地优化局部变量的使用。
为了完整起见,如上面评论中所述,这在 Python 2.X 中 确实 按预期工作: