web-dev-qa-db-ja.com

Pythonのカンマ演算子は割り当て中にどのように機能しますか?

Python docs( http://docs.python.org/reference/simple_stmts.html#assignment-statements )で割り当てステートメントを読んでいました。

その中で引用されている:

ターゲットが括弧または角括弧で囲まれたターゲットリストである場合:オブジェクトは、ターゲットリスト内のターゲットと同じ数のアイテムを持つ反復可能オブジェクトである必要があり、そのアイテムは左から右に対応するアイテムに割り当てられますターゲット。

それを読んだ後、私はこのようなサンプルを書くことを考えました:

a = 5
b = 4
a, b = a + b, a
print a, b

私の仮定では、aとbの両方の値が9である必要がありました。

しかし、私は間違っていることが証明されています。 「a」の値は9で、「b」の値は5です。

誰かがこれをよりよく理解するのを助けることができますか?新しい値ではなく古い値「a」が割り当てられるのはなぜですか?ドキュメントに従って、aの値が最初に割り当てられますよね?何か不足していますか?

27
thiruvenkadam

代入演算子の右側にあるすべての式は、代入が行われる前に評価されます。

Pythonチュートリアル:プログラミングへの第一歩 から:

最初の行には複数の割り当てが含まれています。変数aとbは同時に新しい値0と1を取得します。最後の行ではこれが再度使用され、右側の式を示しています割り当てが行われる前に、すべてが最初に評価されます。右側の式は、左から右に評価されます。

鉱山を強調します。

あなたのコードは機能的に次のものと同等です:

a, b = 5 + 4, 5
print a, b
31
Mark Byers

Pythonには、Cのような「コンマ演算子」はありません。代わりに、コンマはタプルを作成する必要があることを示します。の右側

a, b = a + b, a

2つのアイテムを含むタプルですa + bおよびa

割り当ての左側にあるコンマは、引用したルールに従ってシーケンスのアンパックを実行する必要があることを示しています。aにはタプルの最初の要素、bには2番目の要素が割り当てられます。

19
Sven Marnach

割り当ては、順番に行われるのではなく、コピーで並行して行われると考えることができます。

これがpythonでスワップ関数が必要ない理由です:

a, b = b, a

一時変数cがなくても十分に機能します。

16
Preet Kukreti