Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 速记代码和Fibonnaci序列_Python - Fatal编程技术网

Python 速记代码和Fibonnaci序列

Python 速记代码和Fibonnaci序列,python,Python,我发现斐波那契序列的例子如下: def fib(n): a, b = 0, 1 while b < n: print (b) a, b = b, a+b fib(20) 对吧? 现在,遵循同样的逻辑 a, b = b, a+b #should be the same as writing a = b b = a+b 但这并不是因为如果我这样写的话,输出是不同的。 我很难理解为什么。有什么想法吗 是的,这不完全一样,因为当你写作时- a,

我发现斐波那契序列的例子如下:

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

fib(20)
对吧?

现在,遵循同样的逻辑

a, b = b, a+b #should be the same as writing
a = b
b = a+b
但这并不是因为如果我这样写的话,输出是不同的。
我很难理解为什么。有什么想法吗

是的,这不完全一样,因为当你写作时-

a, b = b, a+b
a = b
b = a+b
考虑执行语句时
a
b
的值,假设在此语句之前,
a=1
b=2
,然后计算第一个右侧,因此计算
b=2
,并计算
a+b=3
。然后进行赋值,即
a
为赋值
2
b
为赋值
3

但是当你写作的时候-

a, b = b, a+b
a = b
b = a+b
赋值与计算一起发生,即首先计算
b=2
,然后赋值给a,因此a变为2,然后计算a+b(a的值发生变化),因此
a+b=4
并将其赋值给b,因此
b
变为
4
,从而产生差异

a,b = b, a
这是交换
a
b
的值的缩写,请注意,如果不使用此符号交换值,则需要一个临时变量

从内部看,它的工作原理是将右侧sid制作成一个元组,然后将值解压缩,这是一个简单的测试-

>>> a = 5
>>> b = 10
>>> t = a, b
>>> t
(5, 10)
>>> b, a = t

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

a = c
b = d
它实际上是这个的简写:

a, b = (c, d)
也就是说,您正在创建一个元组
(c,d)
,一个值为
c
d
的元组,然后将其放入目标列表
a,b
。元组及其值是在将值解压缩到目标列表之前创建的。它实际上是一个原子操作,而不是几个操作的简写。因此,目标列表中的一个变量是否也出现在赋值操作的右侧并不重要


*不是数据库ACID意义上的“原子”,但仍然不是单独的语句。

这不是一回事

x,y=y,x

等于:

t=x
x=y
y=t

它实际上使用一个临时变量来交换
x
y

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

m=a;n=b

a=n

b=m+n