2017-01-12 101 views
4

有人可以向我解釋第4行正在做什麼?逗號分隔的變量賦值

1 def fib2(n): # return Fibonacci series up to n 
2 ...  """Return a list containing the Fibonacci series up to n.""" 
3...  result = [] 
4...  a, b = 0, 1 #this line 
5...  while a < n: 
6...   result.append(a) 
7...   a, b = b, a+b 
8...  return result  
+0

第4行基本上是'a = 0'和'b = 1'但是縮短 – MooingRawr

+0

它將0和1分配給'a'和(所以'a'得到0和'b'得到1) – khelwood

+0

https://docs.python.org/3/reference/simple_stmts.html#assignment-statements – wwii

回答

6

你描述的是tuple assignment

a, b = 0, 1 

相當於a = 0b = 1

但是,如果您想要交換值,它可以產生有趣的效果。像:

a,b = b,a 

將首先構造一個元組(b,a)然後untuple它並將其分配給ab。這是因此不等同於:

#not equal to 
a = b 
b = a 

但(使用臨時):

t = a 
a = b 
b = t 

一般來說,如果你有一個逗號分隔的左賦值運算符的變量列表和一個表達式生成一個元組,該元組被解包並存儲在值中。所以:

t = (1,'a',None) 
a,b,c = t 

將分配給1a'a'bNonec。請注意,這不是語法糖:編譯器不會查看左側的變量數是否與右側的元組長度相同,因此您可以從函數等返回元組,並將它們解壓到單獨的變量中。

+2

我一直都知道它是tuple包裝/開箱,或更一般的*序列拆包*。參見[元組和序列](https://docs.python.org/2/tutorial/datastructures。html#元組和序列) –

+0

記住函數和類方法也可以返回元組。例如:'def myfunc():return 2,4'可以用作'a,b = myfunc()',它可以使'a = 2'和'b = 4'或'myfunc()[0]'這將返回'2'。 –

+1

@AndrejŽukov-Gregorič:這就是爲什麼在最後的代碼片段中,我明確地首先構造了一個元組並將其存儲到't'中:這樣人們可以推斷這不是語法糖,而是實際上元組解包。 –

1

有關讀取的目的,所有它做是設置ab,使得a = 0和b = 1。類似地,在第7行,它的設置abb到的ab總和。

更具體地說,它是設置元組。元組是不變的,因爲一旦它們被創建,它們的值就不會改變。元組遍佈python--你幾乎可以在任何地方看到它們。

通常情況下,您會希望元組位於括號內,例如, (a, b) = (0, 1)會更乾淨地讀取,但它們是python的一大特性,以至於括號是可選的(除非您將元組構造爲函數的參數,然後您需要額外的括號來區分單個元組和多個元組也就是說,你必須說foo((a, b))將元組傳遞給foo,因爲foo(a, b)會傳遞兩個參數給它。)

元組的長度可以是任意長度。你可以寫a, b, c, d, e = 0, 1, 2, 3, 4,或者你可以有一個函數返回一個元組,例如:ret1, ret2, ret3 = foobar(1)