Pythonでできること:
a, b = 1, 2
(a, b) = 1, 2
[a, b] = 1, 2
dis
を使用して生成されたバイトコードをチェックしましたが、それらは同一です。
では、なぜこれを許可するのですか?他の代わりにこれらのいずれかが必要になりますか?
割り当ての左側にさらに構造を含める必要がある場合の1つは、Pythonやや複雑なシーケンスをアンパックします。たとえば:
# 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
これは、たとえば列挙を使用して2タプルのシーケンスを反復処理する場合など、過去に有用であることがわかっています。何かのようなもの:
>>> 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タプルは括弧付きまたは括弧なしで記述できます。
_a = 1, 2, 3
_
に等しい
_a = (1, 2, 3)
_
タプル_(1, 2)
_を関数f
に渡したい場合など、あいまいさを解決するために括弧が必要な場合があります。f((1, 2))
と書く必要があります。括弧が必要な場合があるため、_(a + b)
_の代わりに常に_a + b
_と書くことができるように、一貫性を保つために括弧は常に許可されます。
ネストされたシーケンスをアンパックする場合は、括弧も必要です。
_a, (b, c) = 1, (2, 3)
_
角括弧も許可する理由はないようで、人々はめったにそうしません。
また、割り当ては右から左、右に行われるため、2つの要素のシーケンスである1つのタイプがあります。割り当ての呼び出しが行われると、シーケンスがアンパックされ、それらの値に一致して与えられる対応する要素が検索されます。はい、この場合、シーケンスがそれぞれの要素に展開される場合、いずれかの方法で問題ありません。
単一要素のイテラブルをアンパックすると、リストの構文がきれいになります。
a,=f() # comma looks out of place
(a,)=f() # still odd
[a]=f() # looks like every other list
開き括弧は、複数行の割り当てを可能にします。たとえば、csv.reader()
から行を読み取ると、コードが読みやすくなり(効率が低い場合)、単一の割り当てで名前付き変数にリストをロードします。
括弧で始まると、longまたは\
エスケープされた行。
(a, b, c) = [1, 2, 3]
(より長い変数名を想像してください)