这个Python程序发生了什么?

jim*_*3po 3 python iterator variable-assignment

我想知道第8行的内容是什么.

# Iterators

class Fibs:
    def __init__(self):
        self.a = 0
        self.b = 1
    def next(self):
        self.a, self.b = self.b, self.a+self.b # <--- here
        return self.a
    def __iter__(self):
        return self

fibs = Fibs()

for f in fibs:
    if f > 1000:
        print f
        break
Run Code Online (Sandbox Code Playgroud)

程序的其余部分我真的不需要太多解释.我不确定是什么分配给了什么.

Mar*_*ers 8

这是一个大致相当于此的多重赋值:

tmp = self.a
self.a = self.b
self.b = tmp + self.b
Run Code Online (Sandbox Code Playgroud)

或者这个伪代码:

a' = b
b' = a + b

正如您所看到的,多重分配比单独分配更简洁,更类似于伪代码示例.

几乎这个例子在Python文档中给出,作为计算Fibonacci数的一个例子.多重赋值的一个优点是在任何赋值发生之前评估右侧的变量,在这种情况下节省了对临时变量的需求.


Jac*_*ack 7

这是一对配对,简写

t = self.a
self.a = self.b
self.b = t+self.b
Run Code Online (Sandbox Code Playgroud)

只是使用一个班轮而不是两个赋值..准确地说我认为赋值的左操作数被认为是两个元素的元组,让你像分配给元组(self.a, self,b)的值(self.b, self.a+self.b),其做同样的事情作为三在不需要临时变量的情况下编写的单独分配.这是因为,在不使用元组的情况下,分配按顺序执行,在您的示例中,它们同时被解析,保留self.a第二个赋值中的值.

如文件中所述:

如下递归地定义对象到目标列表的分配.

  • 如果目标列表是单个目标:将该对象分配给该目标.
  • 如果目标列表是以逗号分隔的目标列表(您的情况):该对象必须是具有与目标列表中的目标相同的项目数的可迭代项,并且项目从左到右分配给相应的目标.(从Python 1.5开始,此规则是放宽的;在早期版本中,对象必须是元组.由于字符串是序列,因此只要字符串具有正确的长度,就像a,b ="xy"这样的赋值现在是合法的. )

  • 这将导致`self.b`乘以2,而不是两个变量的总和. (3认同)