Name localization
Now that we are familiar with all types of comprehensions and generator expression, let's talk about name localization within them. Python 3.* localizes loop variables in all four forms of comprehensions: list
, dict
, set
, and generator expressions. This behavior is therefore different from that of the for
loop. Let's see a simple example to show all the cases:
# scopes.py A = 100 ex1 = [A for A in range(5)] print(A) # prints: 100 ex2 = list(A for A in range(5)) print(A) # prints: 100 ex3 = dict((A, 2 * A) for A in range(5)) print(A) # prints: 100 ex4 = set(A for A in range(5)) print(A) # prints: 100 s = 0 for A in range(5): s += A print(A) # prints: 4
In the preceding code, we declare a global name, A = 100
, and then we exercise the four comprehensions: list
, generator expression, dictionary, and set
. None of them alter the global name, A
. Conversely, you can see at the end that the for
loop modifies it. The last print statement prints 4
.
Let's see what happens...