私信  •  关注

LRGH

LRGH 最近创建的主题
LRGH 最近回复了
10 年前
回复了 LRGH 创建的主题 » exec函数未按预期工作(python)[重复]

我想说这是一只蟒蛇。

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的行为。
  • 如果变量设置在 执行程序 这个变量以前不存在,然后 执行程序 修改内部字典,除非随后设置了变量。好像路上有个虫子 本地人() 更新字典;此错误允许访问 执行程序 通过呼叫 本地人() 之后 执行程序 .