A quote from something:
>>> x = y = somefunction()
is the same as
>>> y = somefunction() >>> x = y
Question: Is
x = y = somefunction()
the same as
x = somefunction() y = somefunction()
?
Based on my understanding, they should be same because somefunction
can only return exactly one value.
Neither.
x = y = some_function()
is equivalent to
temp = some_function() x = temp y = temp
Note the order. The leftmost target is assigned first. (A similar expression in C may assign in the opposite order.) From the docs on Python assignment:
...assigns the single resulting object to each of the target lists, from left to right.
Disassembly shows this:
>>> def chained_assignment(): ... x = y = some_function() ... >>> import dis >>> dis.dis(chained_assignment) 2 0 LOAD_GLOBAL 0 (some_function) 3 CALL_FUNCTION 0 6 DUP_TOP 7 STORE_FAST 0 (x) 10 STORE_FAST 1 (y) 13 LOAD_CONST 0 (None) 16 RETURN_VALUE
CAUTION: the same object is always assigned to each target. So as @Wilduck and @andronikus point out, you probably never want this:
x = y = [] # Wrong.
In the above case x and y refer to the same list. Because lists are mutable, appending to x would seem to affect y.
x = [] # Right. y = []
Now you have two names referring to two distinct empty lists.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With