为了账号安全,请及时绑定邮箱和手机立即绑定

exec如何与当地人合作?

exec如何与当地人合作?

慕仙森 2019-07-27 10:57:23
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


查看完整回答
反对 回复 2019-07-27
  • 3 回答
  • 0 关注
  • 409 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信