packing unpacking depends on order.
Steven D'Aprano
steve at pearwood.info
Wed Sep 2 08:26:08 EDT 2015
On Wed, 2 Sep 2015 08:01 pm, Antoon Pardon wrote:
>
>>>> a = [1, 2, 3, 4, 5]
>>>> b = 1
>>>> b, a[b] = a[b], b
>>>> a
> [1, 2, 1, 4, 5]
Equivalent to:
temp1 = a[b] # a[1] == 2
temp2 = b # 1
b = temp1 # b = 2
a[b] = temp2 # a[2] = 1
Or using a queue (FIFO) rather than temp variables:
push a[b]
push b
b = pop
a[b] = pop
which seems sensible to me. The right hand side of the assignment is
evaluated left-to-right, and then the assignments are made, from
left-to-right. Which I believe matches the documented order.
>>>> a = [1, 2, 3, 4, 5]
>>>> b = 1
>>>> a[b], b = b, a[b]
>>>> a
> [1, 1, 3, 4, 5]
Likewise:
temp1 = b # 1
temp2 = a[b] # a[1] == 2
a[b] = temp1 # a[1] = 1
b = temp2 # b = 2
> I think I understand how it gets these results
> but I'm not really happy with them. I think python
> should give the second result in both cases.
Apart from breaking backwards compatibility, how would you implement such a
thing? A simple left-to-right assignment rule is easy to implement and easy
to understand even when the targets depend on each other.
--
Steven
More information about the Python-list
mailing list