Consider this function getPos() which returns a tuple. What is the difference between the two following assignments? Somewhere I saw an example where the first assignment was used but when I just tried the second one, I was surprised it also worked. So, is there really a difference, or does Python just figure out that the left-hand part should be a tuple?
def getPos():
return (1, 1)
(x, y) = getPos() # First assignment
x, y = getPos() # Second assignment
Read about tuples:
A tuple consists of a number of values separated by commas (...)
So parenthesis does not make a tuple a tuple. The commas do it.
Parenthesis are only needed if you have weird nested structures:
x, (y, (w, z)), r
Yes, it's called tuple unpacking:
"Tuple unpacking requires that the list of variables on the left has the same number of elements as the length of the tuple." - Guido Van Rossum
"When you use tuples or lists on the left side of the =, Python pairs objects on the right side with targets on the left and assigns them from left to right." - Lutz and Ascher
There is no difference:
>>> import dis
>>> dis.dis(compile("a,b = expr()", "", "single"))
1 0 LOAD_NAME 0 (expr)
3 CALL_FUNCTION 0
6 UNPACK_SEQUENCE 2
9 STORE_NAME 1 (a)
12 STORE_NAME 2 (b)
15 LOAD_CONST 0 (None)
18 RETURN_VALUE
>>> dis.dis(compile("(a,b) = expr()", "", "single"))
1 0 LOAD_NAME 0 (expr)
3 CALL_FUNCTION 0
6 UNPACK_SEQUENCE 2
9 STORE_NAME 1 (a)
12 STORE_NAME 2 (b)
15 LOAD_CONST 0 (None)
18 RETURN_VALUE
Both a, b
and (a, b)
specify a tuple, and you need a tuple in the LHS (left hand side) for tuple unpacking :)
There's no difference.
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