2

私は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

ありがとう

4

1 に答える 1

13

最初のバージョンでは、あなたが書くとき

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
于 2013-04-27T19:30:34.557 に答える