关于python:逗号分隔的变量赋值

Comma separated variable assignment

本问题已经有最佳答案,请猛点这里访问。

有人可以告诉我第四行在做什么吗?

1
2
3
4
5
6
7
8
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


您描述的是元组分配:

1
a, b = 0, 1

等效于a = 0b = 1

但是,如果您想交换值,它可能会产生有趣的效果。喜欢:

1
a,b = b,a

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

1
2
3
#not equal to
a = b
b = a

但要(使用临时):

1
2
3
t = a
a = b
b = t

通常,如果赋值运算符左边有一个用逗号分隔的变量列表,并且有一个生成元组的表达式,则将元组解包并存储在值中。所以:

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

1分配给a,将'a'分配给b,并且将None分配给c。请注意,这不是语法上的糖:编译器不会查看左侧的变量数是否与右侧的元组的长度相同,因此您可以从函数等返回元组并将其解压缩为单独的变量。


出于阅读目的,它所做的只是将ab设置为a = 0和b =1。类似地,在第7行中,将a设置为b和< x4>到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)