逗号分隔变量赋值

时间:2017-01-12 14:32:48

标签: python python-3.x

有人可以向我解释第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    

2 个答案:

答案 0 :(得分:9)

您所描述的是tuple assignment

a, b = 0, 1

相当于a = 0b = 1

如果您想要交换值,它可能会产生有趣的效果。像:

a,b = b,a

首先构建一个元组(b,a),然后将其解包并将其分配给ab。因此,这不等同于:

#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)

出于阅读的目的,它所做的只是设置ab,以便a = 0和b = 1.同样,在第7行中,它将a设置为b,将b设置为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)