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
相关产品推荐
相关产品推荐

