0

私は Project euler に取り組んでいますが、それは重要ではありません。フィボナッチ数列を出力する簡単なコードを書いています。私は実際にプロジェクトのオイラー方程式の別のコードを持っていますが、これは基本的に私が使用しているアルゴリズムです:

x = 1
y = 0
while x < 4000000:
    print x
    x = y
    y = x + y

これはしばらくの間私を悩ませていました、これはうまくいったはずです。その後、少し調べたところ、実質的に同じコードを見つけましたが、形式が少し異なりました。そしてそれは働いた!唯一の違いは、x と y の割り当てをカンマで区切って 1 行にまとめたことです。だから私はそれを試しました:

x , y = 1 , 0
while x < 4000000:
    print x
    x,y = y, x + y

明らかに、私が言ったように、それはうまくいきました。賢いことと2番目の行の使用量が少ないこと以外に、2つの違いが何であるかを理解できないため、これは本当に気になります。出力が異なる理由がわかりません。なぜ出力が異なるのですか?

4

5 に答える 5

6

最初のコードで:

x = y
y = x + y

あなたは実際にに割り当てy + yていyます。の値xはすでに上書きされているため。そして、これはあなたが望んでいたことではありませんか?


そしてあなたの2番目のコードで:

x, y = y, x + y

最初yx + yRHS が評価され、評価された値がx, yLHS に割り当てられます。したがって、最初のケースで発生していたように、x + yに新しく割り当てられた値の副作用はありません。xだから、あなたyx + y.

したがって、実際の割り当てが完了する前に、evaluation両方の式 onの場合にすぎません。RHS

そうです、while ループの外側の代入は何の違いもありません。しかし、2番目の方法はより魅力的に見えます。

于 2013-02-18T23:44:50.410 に答える
0

これは、行の後x = y、2行目(y = x + y)が。として評価されるためy = y + yです。たとえば、x=2およびy=3としましょう。

それで、

x = y          # i.e. x = 3 now
y = x + y      # i.e. y = 3 + 3 = 6 (while you wanted it to be 5)

一方で、

x, y = y, x + y  # this first assigns values to the right hand side

それで、

x, y = 3, 2 + 3  # i.e x, y = 3, 5
于 2013-02-18T23:52:21.877 に答える
0

y, x+y2番目のバージョンでは、評価時にx + yのxの元の値を使用していると思います。

2行バージョンでは、x+yxがyに設定されていると評価すると、x + yが次の値と同じになりますy+y

于 2013-02-18T23:43:15.280 に答える
0

x を再割り当てします。

数値例を見てみましょう

ケース 1:

x = 4
y = 2
x = y = 4
y = x + y = 4 + 4 = 8

ケース 2:

x = 4
y = 2
x, y = y, x + y = 2, 4 + 2 = 2, 6

したがって、最初のケースでは x は 4 で y は 8 ですが、2 番目のケースでは x は 2 で y は 6 です。

于 2013-02-18T23:44:47.847 に答える
0

最初のバージョンでは、最初の代入によって x の値が変更されます。これは、次の行の割り当ての値に影響します。これは、すでに x を変更したため、y = x + yより似ていることを意味します。y = y+y

2 番目のバージョンでは、2 つの割り当てが同時に行われるため、両方の値が同時に更新されます。

于 2013-02-18T23:45:11.990 に答える