我想说这是一只蟒蛇。
def u():
exec("a=2")
print(locals()['a'])
u()
打印“2”。
def u():
exec("a=2")
a=2
print(a)
u()
打印“2”。
但是
def u():
exec("a=2")
print(locals()['a'])
a=2
u()
失败
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in u
KeyError: 'a'
---编辑---
另一个有趣的行为:
def u():
a=1
l=locals()
exec("a=2")
print(l)
u()
def u():
a=1
l=locals()
exec("a=2")
locals()
print(l)
u()
输出
{'l': {...}, 'a': 2}
{'l': {...}, 'a': 1}
以及
def u():
l=locals()
exec("a=2")
print(l)
print(locals())
u()
def u():
l=locals()
exec("a=2")
print(l)
print(locals())
a=1
u()
输出
{'l': {...}, 'a': 2}
{'l': {...}, 'a': 2}
{'l': {...}, 'a': 2}
{'l': {...}}
显然
exec
当地的情况如下:
-
如果变量设置在
执行程序
这个变量是一个局部变量,然后
执行程序
修改内部字典(返回的字典
locals()
)不会使它回到原来的状态。呼叫
本地人()
更新字典(如python文档第2节所述),并在
执行程序
被遗忘了。
打电话的需要
本地人()
更新字典不是python3的bug,因为它有文档记录,但不直观。此外,事实上,在
执行程序
“不要更改函数的局部变量”是与python2有文档记录的差异(文档中说“如果在函数exec()返回后需要查看代码对局部变量的影响,请传递显式局部变量字典”),我更喜欢python2的行为。
-
如果变量设置在
执行程序
这个变量以前不存在,然后
执行程序
修改内部字典,除非随后设置了变量。好像路上有个虫子
本地人()
更新字典;此错误允许访问
执行程序
通过呼叫
本地人()
之后
执行程序
.