[Tutor] "Strange" behaviour of list comprehension
eryksun
eryksun at gmail.com
Wed Feb 13 23:16:20 CET 2013
On Wed, Feb 13, 2013 at 9:17 AM, Hugo Arts <hugo.yoshi at gmail.com> wrote:
> To be more precise, the comma at the end is part of a tuple (you can omit
> parentheses of a tuple in many cases). This makes the final for loop iterate
> over the tuple (range(y, 10), x + y == z). You'll notice that this only
> works if the variable 'z' is already defined, since the tuple isn't
> constructed in the for loop.
In 3.x the parser requires the parentheses in a list comprehension,
but not in a for loop. And the list comprehension is compiled as a
function, so you get an UnboundLocalError when trying to evaluate
x+y==z.
Just for fun, here's an example that makes a function from the code of
a list comprehension in 3.x. The function takes the first iterator in
the comprehension as an argument:
>>> f = lambda: [(x,y) for x in 'ab' for y in 'cd']
>>> lcomp = type(f)(f.__code__.co_consts[1], globals())
>>> lcomp(iter('12'))
[('1', 'c'), ('1', 'd'), ('2', 'c'), ('2', 'd')]
Never do this. The code assumes the argument is an iterator, so it's
easy to trigger a segfault:
>>> lcomp('12')
Segmentation fault
More information about the Tutor
mailing list