exec如何与当地人合作?

exec如何与当地人合作?

我以为这会打印3,但它打印1:

def f():
    a = 1
    exec("a = 3")
    print(a)


慕仙森
浏览 410回答 3
3回答

HUWWW

在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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python