逗号分隔变量赋值

2024-05-13 01:36:55 发布

您现在位置:Python中文网/ 问答频道 /正文

有人能给我解释一下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    

Tags: thetoreturndeflineresultthislist
2条回答

为了便于阅读,它所做的只是设置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)

你描述的是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。注意,这并不是语法上的甜头:编译器不会检查左边的变量数量是否与右边元组的长度相同,因此您可以从函数等返回元组,并将它们解压到单独的变量中。

相关问题 更多 >