Multiple assignment semantics Multiple assignment semantics python python

Multiple assignment semantics


One case when you need to include more structure on the left hand side of the assignment is when you're asking Python unpack a slightly more complicated sequence. E.g.:

# Works>>> a, (b, c) = [1, [2, 3]]# Does not work>>> a, b, c = [1, [2, 3]]Traceback (most recent call last):  File "<stdin>", line 1, in <module>ValueError: need more than 2 values to unpack

This has proved useful for me in the past, for example, when using enumerate to iterate over a sequence of 2-tuples. Something like:

>>> d = { 'a': 'x', 'b': 'y', 'c': 'z' }>>> for i, (key, value) in enumerate(d.iteritems()):...     print (i, key, value)(0, 'a', 'x')(1, 'c', 'z')(2, 'b', 'y')


Python tuples can often be written with or without the parentheses:

a = 1, 2, 3

is equivalent to

a = (1, 2, 3)

In some cases, you need parentheses to resolve ambiguities, for examples if you want to pass the tuple (1, 2) to the function f, you will have to write f((1, 2)). Because the parentheses are sometimes needed, they are always allowed for consistency, just like you can always write (a + b) instead of a + b.

If you want to unpack a nested sequence, you also need parentheses:

a, (b, c) = 1, (2, 3)

There does not seem to be a reason to also allow square brackets, and people rarely do.


When unpacking a single-element iterable, the list syntax is prettier:

a,=f()    # comma looks out of place(a,)=f()  # still odd[a]=f()   # looks like every other list