Multiple Assignment a = b = c

Sven R. Kunze srkunze at mail.de
Tue Feb 16 08:05:34 EST 2016


Hi Srinivas,

On 16.02.2016 13:46, srinivas devaki wrote:
> Hi,
>
> a = b = c
>
> as an assignment doesn't return anything, i ruled out a = b = c as
> chained assignment, like a = (b = c)
> SO i thought, a = b = c is resolved as
> a, b = [c, c]
>
>
> at-least i fixed in my mind that every assignment like operation in
> python is done with references and then the references are binded to
> the named variables.
> like globals()['a'] = result()
>
> but today i learned that this is not the case with great pain(7 hours
> of debugging.)
>
> class Mytest(object):
>      def __init__(self, a):
>          self.a = a
>      def __getitem__(self, k):
>          print('__getitem__', k)
>          return self.a[k]
>      def __setitem__(self, k, v):
>          print('__setitem__', k, v)
>          self.a[k] = v
>
> roots = Mytest([0, 1, 2, 3, 4, 5, 6, 7, 8])
> a = 4
> roots[4] = 6
> a = roots[a] = roots[roots[a]]
>
>
> the above program's output is
> __setitem__ 4 6
> __getitem__ 4
> __getitem__ 6
> __setitem__ 6 6
>
>
> But the output that i expected is
> __setitem__ 4 6
> __getitem__ 4
> __getitem__ 6
> __setitem__ 4 6
>
> SO isn't it counter intuitive from all other python operations.
> like how we teach on how python performs a swap operation???
>
> I just want to get a better idea around this.

I think the tuple assignment you showed basically nails it.

First, the rhs is evaluated.
Second, the lhs is evaluated from left to right.

Completely wrong?

Best,
Sven



More information about the Python-list mailing list