65

次の Python 式の違いは何ですか:

# First:

x,y = y,x+y

# Second:

x = y
y = x+y

FirstはSecondとは異なる結果を返します。

例えば、

初め:

>>> x = 1
>>> y = 2
>>> x,y = y,x+y
>>> x
2
>>> y
3

2番:

>>> x = 1
>>> y = 2
>>> x = y
>>> y = x+y
>>> x
2
>>> y
4

yFirstで 3、 Secondで 4 です

4

11 に答える 11

103

割り当てステートメントでは、変数の実際の設定を行う前に、常に右辺が完全に評価されます。そう、

x, y = y, x + y

評価y(結果を呼び出しましょうham)、評価x + y(それを呼び出しますspam)、次におよびに設定xします。つまり、まるでhamyspam

ham = y
spam = x + y
x = ham
y = spam

対照的に、

x = y
y = x + y

に設定xy、次に(which ) plusに設定yするため、次と同等ですx== yy

x = y
y = y + y
于 2012-01-04T11:04:55.793 に答える
15

「評価順序」というタイトルのセクションのドキュメントで説明されています。

...代入の評価中、右側が左側より先に評価されます。

于 2012-01-04T11:21:31.803 に答える
7

最初の式:

  1. 値を持つ一時的なタプルを作成しますy,x+y
  2. 別の一時タプルに代入
  3. タプルを変数に抽出しxy

2 番目のステートメントは、タプルを使用していない、実際には 2 つの式です。

驚いたことに、最初の式は実際には次のようになっています。

temp=x
x=y
y=temp+y

コンマの使用法については、「括弧で囲まれた形式」を参照してください。

于 2012-01-04T11:04:46.030 に答える
1

2 番目のケースではx+yx

最初のケースでは、2 番目の結果 ( x+y) が代入されますy

これが、異なる結果が得られる理由です。

編集後

これは、ステートメントで

x,y = y,x+y

右側のメンバーのすべての変数が評価され、左側のメンバーに格納されます。したがって、最初に右のメンバーを使用し、次に左のメンバーを使用します。

2番目のステートメントでは

x = y
y = x + y

最初に評価yしてに割り当てxます。そのように、の合計はの合計x+yと同等であり、最初のケースではy+yありません。x+x

于 2012-01-04T11:01:07.133 に答える
1

最初のものはタプルのような代入です:

x,y = y,x+y

xタプルの最初の要素はどこにありy、2 番目の要素は次のとおりです。

x = y
y = x+y

一方、2番目は直接代入を行っています:

x=y
x=x+y
于 2012-01-04T11:03:13.997 に答える