列表推导和循环中的变量泄漏

考虑以下列表理解

Python 2.x <= 2.7

i = 0
a = [i for i in range(3)]
print(i) # Outputs 2

这只发生在 Python 2 中,因为列表理解将循环控制变量泄漏到周围的范围( )中。此行为可能导致难以发现的错误,并已在 Python 3 中修复

Python 3.x >= 3.0

i = 0
a = [i for i in range(3)]
print(i) # Outputs 0

类似地,for 循环的迭代变量没有私有范围

i = 0
for i in range(3):
    pass
print(i) # Outputs 2

这种行为发生在 Python 2 和 Python 3 中。

为避免泄漏变量的问题,请在列表推导中使用新变量,并在适当时使用循环。