Consider the following list comprehension
i = 0
a = [i for i in range(3)]
print(i) # Outputs 2
This occurs only in Python 2 due to the fact that the list comprehension “leaks” the loop control variable into the surrounding scope (source). This behavior can lead to hard-to-find bugs and it has been fixed in Python 3.
i = 0
a = [i for i in range(3)]
print(i) # Outputs 0
Similarly, for loops have no private scope for their iteration variable
i = 0
for i in range(3):
pass
print(i) # Outputs 2
This type of behavior occurs both in Python 2 and Python 3.
To avoid issues with leaking variables, use new variables in list comprehensions and for loops as appropriate.