exec如何与当地人合作?我以为这会打印3,但它打印1:def f():
a = 1
exec("a = 3")
print(a)
3 回答
HUWWW
TA贡献1874条经验 获得超12个赞
在Python3错误列表中对此问题进行了一些讨论。最终,要获得此行为,您需要执行以下操作:
def foo(): ldict = {} exec("a=3",globals(),ldict) a = ldict['a'] print(a)
如果您查看Python3文档exec
,您将看到以下注释:
默认的locals如
locals()
下面的函数所述:不应尝试修改默认的locals字典。如果您需要在函数exec()返回后查看代码对locals的影响,则传递显式的locals字典。
回到关于错误报告的特定消息,Georg Brandl说:
如果没有几个结果,则无法动态修改函数的局部函数:通常,函数局部函数不存储在字典中,而是存储在数组中,其索引在编译时从已知语言环境确定。这至少与exec添加的新本地人发生冲突。旧的exec语句规避了这一点,因为编译器知道如果函数中没有发生全局/局部因子的exec,那么该命名空间将是“未优化的”,即不使用locals数组。由于exec()现在是一个普通函数,编译器不知道“exec”可能绑定到什么,因此无法特别处理。
重点是我的。
所以,它的要点是,Python3可以更好地优化使用局部变量不会允许在默认情况下此行为。
为了完整起见,正如上面的评论中所提到的,这在Python 2.X中可以正常工作:
Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41) [GCC 4.3.3] on linux2Type "help", "copyright", "credits" or "license" for more information.>>> def f():... a = 1... exec "a=3"... print a... >>> f()3
添加回答
举报
0/150
提交
取消