列表理解中洩露的變數

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'