返回顶部

第十关的联我以为这会打印 3,但它会打印 1: def f(): a = 1 exec("a = 3") print(a)系:登录你的账户(中级)

2

0/300

评论 1

卓越助教

这个问题在Python3 错误列表中有所讨论。最终,要获得这种行为,您需要执行以下操作: def foo(): ldict = {} exec("a=3",globals(),ldict) a = ldict['a'] print(a) 如果您查看 上的 Python3 文档exec,您将看到以下注释: 默认本地人的行为如下所述locals():不应该尝试修改默认本地人字典。如果您需要在函数 exec() 返回后查看代码对局部变量的影响,请传递显式局部变量字典。 这意味着单参数exec不能安全地执行任何会绑定局部变量的操作,包括变量赋值、导入、函数定义、类定义等。如果它使用global声明,它可以分配给全局变量,但不能分配给局部变量。 回顾错误报告中的特定消息,Georg Brandl 说: 动态修改函数的局部变量是不可能的,没有几个后果:通常,函数局部变量不存储在字典中,而是存储在数组中,其索引是在编译时从已知的语言环境中确定的。这至少与 exec 添加的新本地人发生冲突。旧的 exec 语句规避了这一点,因为编译器知道,如果函数中出现没有全局/局部参数的 exec,则该命名空间将是“未优化的”,即不使用 locals 数组。由于 exec() 现在是一个普通函数,编译器不知道 "exec" 可能绑定到什么,因此不能处理 is special。 重点是我的。 所以,它的要点是,Python3可以更好地优化使用局部变量不会允许在默认情况下此行为。 为了完整起见,正如上面评论中提到的,这确实在 Python 2.X 中按预期工作: Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41) [GCC 4.3.3] on linux2 Type "help", "copyrigh

2022-01-10 14:51:52

- 没有更多了 -