31

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

その中で、次のように引用されています。

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

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

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

私の仮定では、a と b の値はどちらも 9 である必要があります。

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

これをよりよく理解するのを手伝ってくれる人はいますか?新しい値ではなく、古い値の 'a' が割り当てられるのはなぜですか? ドキュメントに従って、 a の値が最初に割り当てられますか?何か不足していますか?

4

3 に答える 3

38

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

Python チュートリアルから: プログラミングに向けた最初のステップ:

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

鉱山を強調します。

コードは機能的に次のものと同等です。

a, b = 5 + 4, 5
print a, b
于 2012-07-16T10:15:21.620 に答える
26

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

a, b = a + b, a

a + bは、 と の 2 つの項目を持つタプルaです。

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

于 2012-07-16T10:16:29.717 に答える
21

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

これが、Python で swap 関数を必要としない理由です。

a, b = b, a

一時変数を必要とせずに十分に機能しますc

于 2012-07-16T10:15:49.047 に答える