列表理解中泄露的变量

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'