5

これは彼らが持っているものです:

def fib(n):
    a, b = 0, 1
    while a < n:
        print a,
        a, b = b, a+b

これは私が持っているものです:

def fib(n):
    a = 0
    b = 1
    while a < n:
        print a
        a = b
        b = b+a

最初のものは使用時に正しいシーケンスを返しますが、私のものは 0、1、2、4、8、16、32... と進みます。

私は現在プログラミングを学んでいます (以前にコンピューター サイエンスの教育を受けていません)。問題は、変数の定義方法にあることは明らかです。変数をコンマで区切ることと、変数を改行で区切ることの違いは何ですか (それが問題であると仮定して)?

4

2 に答える 2

8

これはタプルの割り当てです:

a, b = 0, 1

と考えることもできます。

(a, b) = (0, 1)

0値を使用して一時的なタプルが作成さ1れ、変数にアンパックされab

これもタプル代入です

a, b = b, a+b

繰り返しますが、次のように考えることができます。

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

一時的なタプルは、 と のいずれかが更新される前の値から作成さba+b ます。割り当ては、一時的なタプルが作成された後にのみ発生します。

個別のステップに分割することで、コードの意味を変更しています。

ここで何が起こるか見てみましょう

a, b = 0, 1        # a=0 , b=1
a, b = b, a+b      # a=1 , b=1

と比べて

a = 0              # a=0
b = 1              # a=0 , b=1
a = b              # a=1 , b=1
b = b+a            # a=1 , b=2 
于 2013-03-20T05:29:41.737 に答える
5

違いは 1 つだけです。

最初のものでは、代入b = b+aは の変更前に行われaます。これは、割り当てが行われる前に、RHS の両方の式が最初に評価されるためです。

2番目のものでは、2番目の割り当ては の変更後に行われaます。そのため、間違った結果が表示されます。

だから、あなたのコードで:

b = b + a

実際には:

b = b + b

aの値が既に割り当てられているためですb

于 2013-03-20T05:20:56.717 に答える