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=xx=y
y=t 它实际上使用一个临时变量来交换
x
和y
所以回到a,b=b,a+b
。此表达式等于:
m=a;n=b
a=n
b=m+n