gpt4 book ai didi

python - "exec expr in globals(), locals()"的分配顺序出乎意料

转载 作者:太空狗 更新时间:2023-10-29 21:55:33 27 4
gpt4 key购买 nike

Python 2.X 中的以下代码会按您的预期打印“a : 2”:

def f():
#a = 1
exec "a = 2" in globals(), locals()
for k,v in locals().items(): print k,":",v
#a = 3

f()

但是如果您取消注释“a = 1”,那么它会打印“a : 1”,这出乎我的意料。更奇怪的是,如果您取消对“a = 3”行的注释,那么它根本不会打印任何内容,这是我绝对没有预料到的(我有一个莫名其妙的错误,我对此进行了提炼)。

我认为答案隐藏在 locals() 和 globals() 的文档中,或者可能在其他问题中 like this但我认为值得将此表现出来。

我很想了解 Python 解释器在这里的想法,以及解决方法的建议。

最佳答案

旧的 Python 2 的 exec 会更改字节码以搜索本地和全局命名空间。

当您在全局中定义a = 2 时,这是注释a = 1 时找到的那个。当您取消注释 a = 3 时,这是 a“找到”但尚未定义。

如果您阅读了此 great article by Eli Bendersky 中符号表的处理方式,您可以更好地理解局部变量是如何处理的。

你不应该对这种代码使用 exec(我希望这不是生产代码)并且当你将你的代码移植到 Py3k 时它无论如何都会中断:

Python 3 的 exec 函数不再是语句,因此无法更改它所在的环境。


也许我应该直奔主题:

如果你正在做所有这些动态命名的事情,你应该使用字典:

def f():
data = {'a': 1}
data['a'] = 2
if ...:
data['a'] = 3

关于python - "exec expr in globals(), locals()"的分配顺序出乎意料,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12484706/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com