列表推導和迴圈中的變數洩漏

考慮以下列表理解

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 中。

為避免洩漏變數的問題,請在列表推導中使用新變數,並在適當時使用迴圈。