2014-02-24 246 views
6

這是我的第一個問題,我開始學習Python,所以我會問。 是否有差異之間:當你把它寫在下面的例子Python a,b = b,a + b

a, b = b, a + b 

and 

a = b 
b = a + b 

它顯示了不同的結果。

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

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

@Ben:確定它有。 – geoffspear

回答

24

a, b = b, a + b中,在分配到左側之前評估右側的表達式。因此,它是等價於:

c = a + b 
a = b 
b = c 

在第二個例子中,a價值已經被b = a + b運行時間改變。因此,結果是不同的。

+0

謝謝。我現在看到它是如何工作的。 – Ante

13

線:

a, b = b, a + b 

接近:

temp_a = a 
a = b 
b = temp_a + b 

b其中使用a之前值的a被再分配的b值。

Python首先評估右手錶達式並將結果存儲在堆棧中,然後將這兩個值分配給ab。這意味着a + b的計算結果爲之前a已更改。

請參閱How does swapping of members in the python tuples (a,b)=(b,a) work internally?瞭解如何在字節碼級別執行此操作。

5

比方說,我們開始與ab這樣的:

a = 2 
b = 3 

所以,當你這樣做:

a, b = b, a + b 

發生的事情是你創建的元組(b, a + b)(3, 5),然後將其解壓到ab因此a變成3b變成5

在你的第二個例子:

a = b 
# a is now 3 
b = a + b 
# b is 3 + 3, or 6. 
0

我希望你沒有用C語言,它賦值運算符=的優先級高於逗號運算,較高的影響。不要以爲它是(a), (b = b), (a + b)。這是一個元組賦值,意思是(a, b) = (b, a + b)

0

a, b = b, a + b類似於a, b = 0, 1同時爲兩個變量a, b賦值。首先分配a = b,然後分配b = a + b

0

讓我們來討論它。

a, b = b, a + b

這是一個元組分配,意味着(a, b) = (b, a + b),就像(a, b) = (b, a)

開始從一個簡單的例子:

a, b = 0, 1 
#equivalent to 
(a, b) = (0, 1) 
#implement as 
a = 0 
b = 1 

當談到(a, b) = (b, a + b)
EAFP,都直接嘗試

a, b = 0, 1 
a = b #a=b=1 
b = a + b #b=1+1 
#output 
In [87]: a 
Out[87]: 1 
In [88]: b 
Out[88]: 2 

然而,

In [93]: a, b = b, a+b 
In [94]: a 
Out[94]: 3 
In [95]: b 
Out[95]: 5 

結果是從第一次嘗試不同。

臨屋的因爲Python首先計算右手a+b
所以它等同於:

old_a = a 
old_b = b 
c = old_a + old_b 
a = old_b 
b = c 

綜上所述,a, b = b, a+b手段,
a交流,以獲得OLD_VALUE的b
b交流,以獲得舊值a和舊值之和b,

相關問題