2017-01-12 98 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)