list comprehension misbehaving
duncan smith
buzzard at invalid.invalid
Thu Mar 28 11:54:23 EDT 2013
On 28/03/13 15:25, Wolfgang Maier wrote:
> Dear all, with
> a=list(range(1,11))
>
> why (in Python 2.7 and 3.3) is this explicit for loop working:
> for i in a[:-1]:
> a.pop() and a
>
> giving:
> [1, 2, 3, 4, 5, 6, 7, 8, 9]
> [1, 2, 3, 4, 5, 6, 7, 8]
> [1, 2, 3, 4, 5, 6, 7]
> [1, 2, 3, 4, 5, 6]
> [1, 2, 3, 4, 5]
> [1, 2, 3, 4]
> [1, 2, 3]
> [1, 2]
> [1]
>
> but the equivalent comprehension failing:
> [a.pop() and a for i in a[:-1]]
>
> giving:
> [[1], [1], [1], [1], [1], [1], [1], [1], [1]]
>
> ???
> Especially, since these two things *do* work as expected:
> [a.pop() and a[:] for i in a[:-1]]
> [a.pop() and print(a) for i in a[:-1]] # Python 3 only
>
> Thanks for your help,
> Wolfgang
>
With the for loop the list is printed each time you pop an element. With
the list comprehension all but one of the elements are popped before the
string representation of the resulting list (containing several
references to a) is printed.
The two list comprehensions that you say "work" behave differently
because the first contains copies of a (which are unaffected by
subsequent pops), and the second because (I imagine) it does something
similar to,
[a.pop() and repr(a) for i in a[:-1]]
on 2.7 (I haven't migrated to 3 yet). i.e. The list contains a
representation of a after each element is popped.
Duncan
More information about the Python-list
mailing list