速记代码和Fibonnaci序列

时间:2015-06-29 14:45:28

标签: python

我找到了斐波那契序列的例子:

def fib(n):
    a, b = 0, 1
    while b < n:
        print (b)
        a, b = b, a+b

fib(20)

所以这就是我得不到的东西:

a, b = 0, 1 # is just a shortcut for writing
a = 0
b = 1

正确?

现在,遵循相同的逻辑

a, b = b, a+b #should be the same as writing
a = b
b = a+b

但这不是因为如果我这样写,输出就不同了。 我很难理解为什么。有什么想法吗?

3 个答案:

答案 0 :(得分:3)

是的它不完全一样,因为当你写 -

a, b = b, a+b

考虑执行语句时ab的值,在此语句之前说a=1b=2,然后是第一个右侧计算后,计算b=2并计算a+b=3。然后进行分配,即为a分配值2,为b分配值3

但是当你写作 -

a = b
b = a+b

分配与计算一起发生,即先计算b=2,然后分配给a,所以a变为2,然后计算a + b(改变a的值),所以{{1并且它被分配给b,因此a+b=4变为b,因此也就是差异。

4

这是交换a,b = b, a a值的简写,请注意,如果您想在不使用此表示法的情况下交换值,则需要一个临时变量。

内部如何工作是将右手sid制成元组,然后将值解压缩,这是一个简单的测试 -

b

答案 1 :(得分:1)

a, b = c, d 不是以下内容的简写:

a = c
b = d

它实际上是速记:

a, b = (c, d)

即,您正在创建一个元组(c, d),一个元组值为cd,然后unpacked进入目标列表{ {1}}。在将值解压缩到目标列表之前创建具有其值的元组。它实际上一个原子*操作,而不是几个操作的简写。因此,目标列表中的一个变量是否也出现在赋值操作的右侧并不重要。

* Not&#34; atomic&#34;在数据库ACID意义上,但仍然没有单独的陈述。

答案 2 :(得分:1)

这不是一回事。

x, y = y, x

等于:

  

t = x
  x = y
  y = t

它实际上使用临时变量来交换xy

回到a, b = b, a+b。此表达式等于:

  

m = a; n = b

     

a = n

     

b = m + n