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