列表理解中泄露的变量
Python 2.x >= 2.3
x = 'hello world!'
vowels = [x for x in 'AEIOU']
print (vowels)
# Out: ['A', 'E', 'I', 'O', 'U']
print(x)
# Out: 'U'
Python 3.x >= 3.0
x = 'hello world!'
vowels = [x for x in 'AEIOU']
print (vowels)
# Out: ['A', 'E', 'I', 'O', 'U']
print(x)
# Out: 'hello world!'
从示例中可以看出,在 Python 2 中,x
的值被泄露:它掩盖了 hello world!
并打印出 U
,因为这是当循环结束时 x
的最后一个值。
但是,在 Python 3 中,x
打印最初定义的 hello world!
,因为列表推导中的局部变量不会屏蔽周围范围内的变量。
此外,生成器表达式(自 2.5 以来在 Python 中可用)或字典或集合理解(从 Python 3 向后移植到 Python 2.7)都不会泄漏 Python 2 中的变量。
请注意,在 Python 2 和 Python 3 中,使用 for 循环时,变量将泄漏到周围的范围中:
x = 'hello world!'
vowels = []
for x in 'AEIOU':
vowels.append(x)
print(x)
# Out: 'U'