3 回答
TA贡献1825条经验 获得超4个赞
execexec()exec
exec
locals()
def foo(): a = 'spam' locals()['a'] = 'ham' print(a) # prints 'spam'
execLOAD_FASTLOAD_NAMEexec()
execlocals()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.
添加回答
举报
