有人可以向我解释第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 :(得分:9)
您所描述的是tuple assignment:
a, b = 0, 1
相当于a = 0
和b = 1
。
如果您想要交换值,它可能会产生有趣的效果。像:
a,b = b,a
首先构建一个元组(b,a)
,然后将其解包并将其分配给a
和b
。因此,这不等同于:
#not equal to
a = b
b = a
但是(使用临时):
t = a
a = b
b = t
通常,如果您在赋值运算符左侧有一个以逗号分隔的变量列表,并且生成元组的表达式,则会将元组解压缩并存储在值中。所以:
t = (1,'a',None)
a,b,c = t
会将1
分配给a
,将'a'
分配给b
,将None
分配给c
。请注意,这不是语法糖:编译器不会查看左侧变量的数量是否与右侧元组的长度相同,因此您可以从函数等返回元组并将它们解压缩到单独的变量中
答案 1 :(得分:1)
出于阅读的目的,它所做的只是设置a
和b
,以便a
= 0和b
= 1.同样,在第7行中,它将a
设置为b
,将b
设置为a
和b
的总和。
更具体地说,它设置了元组。元组是不变的,因为一旦它们被创造,它们的价值就不会改变。元组在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)