Shu*_*uny 4 python scope python-3.x
我目前正在将脚本从 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])
Run Code Online (Sandbox Code Playgroud)
Python 2.7.18 显示以下输出:
['variable_1', 'variable_2']
['variable_1', 'variable_2']
Run Code Online (Sandbox Code Playgroud)
而 Python 3.9.0 显示:
[]
['variable_1', 'variable_2']
Run Code Online (Sandbox Code Playgroud)
为什么第一个列表理解在 Python 3 中不起作用?为什么它在存储vars()变量内的内容时有效?
che*_*ner 10
它在两者中都起作用:只是工作方式不同。
\n在 Python 3 中,列表推导式创建自己的局部作用域,以避免将变量名称泄漏到调用作用域中。对列表理解内部的调用vars()只是返回列表理解自身作用域中定义的变量,而不是使用列表理解的作用域。
来自https://docs.python.org/3/reference/expressions.html#displays-for-lists-sets-and-dictionaries:
\n\n\n但是,除了最左边的 for 子句中的可迭代表达式之外,推导式是在单独的隐式嵌套范围中执行的。这确保目标列表中分配给的名称不\xe2\x80\x99t \xe2\x80\x9cleak\xe2\x80\x9d 进入封闭范围。
\n
| 归档时间: |
|
| 查看次数: |
226 次 |
| 最近记录: |