【发布时间】:2019-08-21 15:54:21
【问题描述】:
以下代码适用于 Python 2.7,用于将局部变量动态注入函数范围:
myvars = {"var": 123}
def func():
exec("")
locals().update(myvars)
print(var)
func()
# assert "var" not in globals()
这有点微妙,但是 exec 语句的存在向编译器表明本地命名空间可能被修改。在参考实现中,它将名称“locals”的查找从 LOAD_GLOBAL 操作转换为 LOAD_NAME 操作,从而可以添加到本地命名空间。
在 Python 3 中,exec 变成了函数而不是语句,locals() 调用返回命名空间的副本,其中修改无效。
如何在 Python 3 中重新创建这个想法,在函数内部动态创建局部变量?或者这是仅在 Python 2.x 中才有的“功能”?
注意:代码不能绑定外部作用域的名称。
【问题讨论】:
-
请注意,Python3 中的
help(locals)包含文本“更新此字典是否会影响本地范围内的名称查找,反之亦然是*实现依赖*,并且不包含任何向后兼容性保证。” -
@AdamSmith 感谢您指出这一点。欢迎提供依赖 CPython 实现细节的答案。
标签: python python-3.x python-2.7 local-variables cpython