2016-04-18 7 views
0

異なっている理由:フィボナッチ数列と協力しながら一つのライナー結果が

a = 1 
b = 3 
a, b = b, a + b 
print a, b 

この私のようにそれをコードし直すかどう適切に今a = 3b = 4

に結果:

a = 1 
b = 3 
a = b 
b = a + b 
print a, b 

結果変数b4の代わりに6です。

ワンライナーa, b = b, a + bを使用すると、「シーンの裏側」には何が起こりますか?

+0

b = 3#の値は3です。a = b#の値は3です。3 + 3は6です。何をもっとお望みですか? – Sam

+0

2番目の例では 'b = b + b'は' a'が 'b'の値を1行早く取得するためです。 1ライナーでは起こらない。 – ptrj

+0

a = bと書くと、bの値を変数aに代入するだけです。 – Taylan

答えて

6

tuple packing and sequence unpackingの組み合わせです。これは、右側のタプルは「古い」値が使用されている理由である割り当て、前に評価され

(a, b) = (b, a + b) 

と同じように解析されます。

0

あなたは 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です。

0

()シーケンスをタプルにするのではなく、,です。

a, b = b, a + b # => (a,b) = (a, a+b) if written with brackets 

標準タプルのアンパックです。しかしの名前がabのものは、それぞれという異なるオブジェクトの名前です。つまり、以前はbという名前で、結果はa+bでした。この現象は、Pythonの変数名がという名前のであり、値を格納するCのようなボックスではないことが原因です。

関連する問題