- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
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/
一直在断断续续做一个项目,2个月没碰了,今天回来,报错无法运行。 IEnumerable query = mediaTitleCollection.OfType(); 调试器在此行停止并给出标题中描述
我最近读了一篇 article关于生成变更日志,我想将其集成到 package.json 脚本中。 我用正确的项目名称稍微更改了文章中的脚本,并将输出导出到 CHANGELOG.md "script
我添加了这段代码,现在我得到了一个意想不到的标记";"错误。 代码: var i = 0; var tabs = ""; while(i "+ idArray[i] +" &nbs
@echo off for /f "tokens=1,2 delims=," %%x in (my.csv) do ( if %M% LSS %%x set M=%%x ) echo Max X Va
我正在尝试重命名我的 Room 数据库中的列。我傻傻的用了列名index,想改成id,但是这个迁移函数很头疼: static final Migration MIGRATION_2_3 = new M
我不确定这是否是一个错误。代码编译得很好(没有警告),但是当我输入一个方法时,本地值(NSMutableString)会在调试器中显示以下内容: __NSAutoreleaseFreedObject(
这个问题在这里已经有了答案: Synchronous/Asynchronous behaviour of python Pipes (1 个回答) 关闭4个月前。 我正在做一个从 udp 套接字接收样
我是一名优秀的程序员,十分优秀!