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

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

推荐答案

这个问题在Python3 bug list篇文章中有所讨论.最终,要获得这种行为,你需要做:

def foo():
    ldict = {}
    exec("a=3",globals(),ldict)
    a = ldict['a']
    print(a)

如果你 Select the Python3 documentation on exec,你会看到下面的注释:

默认局部变量的作用如下面函数locals():modifications to the default locals dictionary should not be attempted所述.如果需要在函数exec()返回后查看代码对局部变量的影响,请传递一个显式局部变量字典.

这意味着一个参数exec不能安全地执行任何绑定局部变量的操作,包括变量赋值、导入、函数定义、类定义等.如果它使用global声明,它可以赋值给全局变量,但不能赋值给局部变量.

回到a specific message on the bug report岁,格奥尔格·布兰德尔说:

动态修改函数的局部变量是不正确的

重点是我的.

因此,其要点是Python3可以更好地优化局部变量的使用,默认情况下允许这种行为.

为了完整性起见,正如上面的 comments 所提到的,这does条代码在Python2中可以正常工作.X:

Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41) 
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> def f():
...     a = 1
...     exec "a=3"
...     print a
... 
>>> f()
3

Python-3.x相关问答推荐

使用Python装载. iso文件

如何立即从asyncio.Task获取异常?

拆分列表的元素并将拆分后的元素包含到列表中

无法提出给定 for 循环的原因 (Python 3.11)

DynamoDB - boto3 - batch_write_item:提供的关键元素与架构不匹配

如果原始字符串包含正斜杠,如何返回具有不同可能性的新字符串

考虑到Pandas 系列中的不同索引,如何正确估计两列的百分比变化? Python相关

如何在Pandas 中按条件计算分组?

使用正确的数据类型时,使用 Cerberus 验证 JSON 架构会引发错误

FastAPI - 调用 API 时设置 response_model_exclude

如何将数据框中的每一行转换为具有属性的 node ?

Python:获取未绑定的类方法

Python socket.error: [Errno 13] 权限被拒绝

运行 PyCharm 测试时如何解决django.core.exceptions.ImproperlyConfigured:找不到 GDAL 库?

导入父目录进行简要测试

python判断一个方法是否被调用而不模拟它

用于 unicode 大写单词的 Python 正则表达式

我可以替换 Python 中对象的现有方法吗?

map 对象不是 JSON 可序列化的

Django Rest 框架 ListField 和 DictField