2011-06-26 20 views
4
a,b = 0,1 
while b < 50: 
    print(b) 
    a = b 
    b = a+b 

出力:Pythonの変数の代入の質問

1 
2 
4 
8 
16 
32 

wheras:

a,b = 0,1 
while b < 50: 
    print(b) 
    a,b = b, a+b 

出力(正しいフィボナッチ数列):

1 
1 
2 
3 
5 
8 
13 
21 
34 

彼らは同じではありませんか?私はa,b = b, a+bが実質的に同じであることを意味するa = bb = a+b別々に書かれて - いいえ?

答えて

11

いいえ、それらは同じではありません。

a,b = b, a+bと書くと、割り当ては「同時に」行われます。 a,b = b, a+b(a, b) = (b, a+b)と同じです。したがって、

の後
a, b = 5, 8 

a = 5およびb = 8です。 Pythonが見たときに最初にこの

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

それ右側(a,b)に左側から(8,13)、次に割り当てる(このタプル)、である(b, a+b)を算出します。


あなたが持っているとき:a = b、その後b = a+b、二つの動作が次々に行われます。しかし、それらの一つ一つについて:

a = b 

それは、最初aに、左側に右側b、その後、譲受人(この値)を算出します。そして再び第1

b = a + b 

それbに、左側に右側a + b、次に割り当てる(この値)を算出します。

+0

AAAH大丈夫です!ありがとう。 :) – 3zzy

+0

タプルは不変なので、タプルに入るものはすべて保存されます(読み取り専用)。 A&Bが左に割り当てられていても、右側のタプルが最初に作成されます(右から左の割り当て)。 – pokstad

+2

「同時に」技術的に偽であるだけでなく、問題を混乱させます。要点は、割り当てが行われる前に右側の式が評価されていることです。したがって、a = a + bとa、b = b、a + bの間には実際に違いはありません。どちらの場合でも、右側の値はaの古い値と、 b。 – senderle

5

これらは同じではありません。最初の例では、aにはbの値が割り当てられ、新しい値はbに追加されます。効果的にb + b

第2の例では、aには現在の値bが割り当てられ、bには現在の値aと現在の値bが割り当てられます。 aの値が変更される前に発生します。

2つの割り当ては、順次ではなく同時に発生します。

5

これらのステートメントは異なります。

a = b 
b = a+b 

aを変更し、その後bを変更するために変更された値を使用します。実際、それはいつもb = b + bです。

a,b = b, a+b 

は同じ瞬間にbaを変更し、そうba値を用いて計算されます。

このため
3

:右側に

a,b = b, a+b 

すべてが最初に評価して、左側に割り当てられています。左辺のaを代入する前に、右側にaの値を使用しています。このため

:2番目の文が実行される前に

a = b 
b = a+b 

aの値が変更されます。だからあなたの結果は異なっています。

1

2番目の例は、「同時」割り当てを実行するために使用されるタプルを表しています。

(A,B)=(B,A+B) 

タプルは不変です。つまり、一度設定した内容は変更できません。また、Pythonは右から左に代入を処理します。したがって、右のタプルが作成されると、A & Bに新しい値が割り当てられていても値を変更することはできません。

a,b = b,a+b:第1の背景で、私は、Pythonのは私たちがxそれを呼び出すと、私たちは、その後yそれを呼びましょう変数にbを割り当ててみましょう変数にa+bを割り当て考える同じ時間に行われる2つの代入操作はどのように

+1

"Simultaneous"は内部的に両方の割り当てを同時に行うわけではないので、引用符で囲みます。 – pokstad

+0

に同意した場合、「同時」は問題を混乱させます。要点は、割り当てが実行される前に、右側の式が評価されることです。これは 'a = a + b'とまったく変わりません。 – senderle

0

xbyaに割り当てます。

私は「同時に」の概念は、論理によって真実ではないと思い、メモリ内のaの値がbまたはその逆、最初に変更する必要があり、そうがない限りaの値がまだbまたはその逆に依存します上記のように新しい値を保持する別の変数。