私はpythonが初めてです。次の2つのpythonの例が同じものを出力しない理由を誰かが説明できますか?
例 1
a, b = 0, 1
while b < 50:
print(b)
a, b = b, a + b
例 2
a, b = 0, 1
while b < 50:
print(b)
a = b
b = a + b
ありがとう
私はpythonが初めてです。次の2つのpythonの例が同じものを出力しない理由を誰かが説明できますか?
例 1
a, b = 0, 1
while b < 50:
print(b)
a, b = b, a + b
例 2
a, b = 0, 1
while b < 50:
print(b)
a = b
b = a + b
ありがとう
最初のバージョンでは、あなたが書くとき
a, b = b, a + b
表現
b, a + b
最初に評価されます。評価された後a, b
、タプルのアンパックで割り当てられます。重要な点は、左側の名前のバインドを実行する前に、代入ステートメントの右側全体が完全に評価されることです。
2 番目のバージョンでは、
a = b
# a is now re-bound and potentially has changed value
が最初に実行され、次に
b = a + b
# the expression a + b uses the modified value of a
後に起こります。その時点で、a
再バインドされています。
したがって、いくつかの値で説明します。a, b = 0, 1
ループを初めて回った後、
# a == 0
# b == 1
a, b = b, a + b
さて、b, a + b
です1, 1
。そして、私たちは持っています
a, b = 1, 1
しかし、代替案は次のようになります。
a = b
# same as a = 1
b = a + b
# same as b = 1 + 1
あなたはコメントで尋ねます:
例 1 を 2 つのステートメントに書き直すにはどうすればよいでしょうか?
最も安全な方法は、一時変数を導入することです。このような:
a1 = b
b1 = a + b
# now we can assign to a and b
a = a1
b = b1
この場合、実際には 2 つの一時変数は必要なく、1 つあれば十分ですが、これが最も一般的な形式です。
このタプルのアンパックは、Python で慣用的に 2 つの値を交換する方法です。他の言語では、次のように記述します。
temp = a
a = b
b = temp
Python では、次のように記述します。
a, b = b, a