You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python2与Python3中列表推导式内vars()的行为差异原因问询

问题原因解析

根本原因是Python 2和3对列表推导的作用域设计存在差异

  • Python 2的列表推导没有独立的局部作用域,运行时直接共享外部代码的作用域,同时存在循环变量泄露到外部的问题
  • Python 3优化了这个设计,给列表推导单独分配了独立的局部作用域,避免变量污染外部
  • 不带参数调用vars()时,返回的是当前运行所在作用域的所有变量组成的字典

为什么第一个列表推导在Python 3中返回空

你在列表推导的判断条件内直接调用vars(),此时vars()运行在列表推导自己的独立局部作用域中,这个作用域里仅存在循环变量variable,不存在variable_1、variable_2这两个定义在外部作用域的变量名,所以筛选结果为空。
如果需要在列表推导内部直接查询全局作用域变量,将vars()替换为globals()即可得到和Python 2一致的结果。

为什么提前保存vars()结果到变量就正常

你在外部作用域调用vars()并赋值给existing_variables时,existing_variables存储的就是外部作用域的完整变量字典。列表推导的局部作用域可以正常访问外部作用域的existing_variables变量,所以判断时是从外部作用域的变量字典中查询,自然可以匹配到目标变量名。

Python 2两次输出一致的原因

Python 2的列表推导没有独立局部作用域,两次调用vars()实际都运行在外部作用域,所以返回结果完全一致。


内容的提问来源于stack exchange,提问作者Shuny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 21:54:03