web-dev-qa-db-ja.com

複数の割り当てセマンティクス

Pythonでできること:

a, b   = 1, 2
(a, b) = 1, 2
[a, b] = 1, 2

disを使用して生成されたバイトコードをチェックしましたが、それらは同一です。
では、なぜこれを許可するのですか?他の代わりにこれらのいずれかが必要になりますか?

66
Aillyn

割り当ての左側にさらに構造を含める必要がある場合の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')
74
Will McCutchen

多くの場合、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)
_

角括弧も許可する理由はないようで、人々はめったにそうしません。

13
Sven Marnach

また、割り当ては右から左、右に行われるため、2つの要素のシーケンスである1つのタイプがあります。割り当ての呼び出しが行われると、シーケンスがアンパックされ、それらの値に一致して与えられる対応する要素が検索されます。はい、この場合、シーケンスがそれぞれの要素に展開される場合、いずれかの方法で問題ありません。

2
Senthil Kumaran

単一要素のイテラブルをアンパックすると、リストの構文がきれいになります。

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

開き括弧は、複数行の割り当てを可能にします。たとえば、csv.reader()から行を読み取ると、コードが読みやすくなり(効率が低い場合)、単一の割り当てで名前付き変数にリストをロードします。

括弧で始まると、longまたは\エスケープされた行。

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

(より長い変数名を想像してください)

0
verbamour