列表理解中 vars() 的 Python 2 和 3 之间的不同行为
Different behavior between Python 2 and 3 of vars() in list comprehension
我目前正在将脚本从 Python 2 转换为 Python 3。在调试它时,我偶然发现了两个版本之间行为不同的部分代码。但是,我无法解释这种差异。
这里是复制者:
variable_1 = "x"
variable_2 = "y"
list_of_variables = ['variable_1', 'variable_2']
existing_variables = vars()
print([variable for variable in list_of_variables if variable in vars()])
print([variable for variable in list_of_variables if variable in existing_variables])
Python 2.7.18 显示以下输出:
['variable_1', 'variable_2']
['variable_1', 'variable_2']
而 Python 3.9.0 显示:
[]
['variable_1', 'variable_2']
为什么第一个列表理解在 Python 3 中不起作用?为什么在变量中存储 vars()
的内容时它会起作用?
两者都有效:只是不同。
在 Python 3 中,列表推导式创建了自己的本地作用域,以避免将变量名泄漏到调用作用域中。在列表理解内部调用 vars()
只是返回在列表理解自己的范围内定义的变量,而不是使用列表理解的范围。
来自https://docs.python.org/3/reference/expressions.html#displays-for-lists-sets-and-dictionaries:
However, aside from the iterable expression in the leftmost for clause, the comprehension is executed in a separate implicitly nested scope. This ensures that names assigned to in the target list don’t “leak” into the enclosing scope.
在 python3 中,vars() 的作用类似于 locals(),这意味着您的 locals() 在列表理解中是不同的。
https://docs.python.org/3/library/functions.html#vars
我目前正在将脚本从 Python 2 转换为 Python 3。在调试它时,我偶然发现了两个版本之间行为不同的部分代码。但是,我无法解释这种差异。
这里是复制者:
variable_1 = "x"
variable_2 = "y"
list_of_variables = ['variable_1', 'variable_2']
existing_variables = vars()
print([variable for variable in list_of_variables if variable in vars()])
print([variable for variable in list_of_variables if variable in existing_variables])
Python 2.7.18 显示以下输出:
['variable_1', 'variable_2']
['variable_1', 'variable_2']
而 Python 3.9.0 显示:
[]
['variable_1', 'variable_2']
为什么第一个列表理解在 Python 3 中不起作用?为什么在变量中存储 vars()
的内容时它会起作用?
两者都有效:只是不同。
在 Python 3 中,列表推导式创建了自己的本地作用域,以避免将变量名泄漏到调用作用域中。在列表理解内部调用 vars()
只是返回在列表理解自己的范围内定义的变量,而不是使用列表理解的范围。
来自https://docs.python.org/3/reference/expressions.html#displays-for-lists-sets-and-dictionaries:
However, aside from the iterable expression in the leftmost for clause, the comprehension is executed in a separate implicitly nested scope. This ensures that names assigned to in the target list don’t “leak” into the enclosing scope.
在 python3 中,vars() 的作用类似于 locals(),这意味着您的 locals() 在列表理解中是不同的。 https://docs.python.org/3/library/functions.html#vars