3 回答
TA贡献1825条经验 获得超4个赞
exec
exec()
exec
exec
locals()
def foo(): a = 'spam' locals()['a'] = 'ham' print(a) # prints 'spam'
exec
LOAD_FAST
LOAD_NAME
exec()
exec
locals()
PyFrame_LocalsToFast
exec()
def execute(a, st): namespace = {} exec("b = {}\nprint('b:', b)".format(st), namespace) print(namespace['b'])
exec()
注:
默认 本地人按所述的功能行事 locals()
下面:对默认值的修改 本地人不应尝试使用字典。传递显式 本地人如果需要查看代码在函数后对局部变量的影响,请使用字典。 exec()
退货。
TA贡献2065条经验 获得超14个赞
def u(): exec("a=2") print(locals()['a'])u()
def u(): exec("a=2") a=2 print(a)u()
def u(): exec("a=2") print(locals()['a']) a=2u()
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 3, in uKeyError: '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=1u()
{'l': {...}, 'a': 2}{'l': {...}, 'a': 2}{'l': {...}, 'a': 2}{'l': {...}}
exec
如果在 exec
这个变量是一个局部变量,然后 exec
修改内部字典(由 locals()
),并且不将其返回到原来的状态。打电话给 locals()
更新字典(如python文档第2节所述),以及 exec
被遗忘了。打电话的需要 locals()
更新字典并不是python 3的一个bug,因为它是文档化的,但它不是直观的。而且事实上 exec
不改变函数的局部变量是与python 2有记录的区别(文档中说“如果您需要在函数exec()返回后看到代码对局部变量的影响,请传递一个显式的局部变量字典”),我更喜欢python 2的行为。 如果在 exec
而这个变量在此之前并不存在 exec
修改内部字典,除非之后设置变量。好像路上有个虫子 locals()
更新字典;此错误允许访问 exec
打电话 locals()
后 exec
.
添加回答
举报