異なっている理由:フィボナッチ数列と協力しながら一つのライナー結果が
a = 1
b = 3
a, b = b, a + b
print a, b
この私のようにそれをコードし直すかどう適切に今a = 3
とb = 4
に結果:
a = 1
b = 3
a = b
b = a + b
print a, b
結果変数b
は4
の代わりに6
です。
ワンライナーa, b = b, a + b
を使用すると、「シーンの裏側」には何が起こりますか?
異なっている理由:フィボナッチ数列と協力しながら一つのライナー結果が
a = 1
b = 3
a, b = b, a + b
print a, b
この私のようにそれをコードし直すかどう適切に今a = 3
とb = 4
に結果:
a = 1
b = 3
a = b
b = a + b
print a, b
結果変数b
は4
の代わりに6
です。
ワンライナーa, b = b, a + b
を使用すると、「シーンの裏側」には何が起こりますか?
tuple packing and sequence unpackingの組み合わせです。これは、右側のタプルは「古い」値が使用されている理由である割り当て、前に評価され
(a, b) = (b, a + b)
と同じように解析されます。
あなたは b = b + b
か、言い換えれば、 b = 3 + 3
、 のでb = 6
と同じである b = a + b
その後、 b = 3
言った後、 a = b
と。
a, b = 3, 1 + 3
またはa, b = 3, 4
のようになります。b = 4
です。
(
)
シーケンスをタプルにするのではなく、,
です。
a, b = b, a + b # => (a,b) = (a, a+b) if written with brackets
標準タプルのアンパックです。しかしの名前がa
とb
のものは、それぞれという異なるオブジェクトの名前です。つまり、以前はb
という名前で、結果はa+b
でした。この現象は、Pythonの変数名がという名前のであり、値を格納するCのようなボックスではないことが原因です。
b = 3#の値は3です。a = b#の値は3です。3 + 3は6です。何をもっとお望みですか? – Sam
2番目の例では 'b = b + b'は' a'が 'b'の値を1行早く取得するためです。 1ライナーでは起こらない。 – ptrj
a = bと書くと、bの値を変数aに代入するだけです。 – Taylan