社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
私信  •  关注

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