我通过迭代处理斐波那契序列。我期望以下两个函数提供相同的结果,但它们没有。
示例1(根据需要返回Fibonacci序列):
def run():
for x in range(0,20):
fib(x)
def fib(n):
a, b = 0, 1
for i in range(n):
a, b = b, a + b
print a
run()
示例1结果:
0
1
1
2
3
5
8
13
21
34
示例2(没有序列解包):
def run():
for x in range(0,20):
fib(x)
def fib(n):
a = 0
b = 1
for i in range(n):
a = b
b = a + b
print a
run()
示例2结果:
0
1
2
4
8
16
32
64
128
256
具体来说,为什么......
a, b = b, a + b
不同于......
a = b
b = a + b
答案 0 :(得分:0)
a, b = b, a + b
首先评估=
的右侧,然后将其分配到左侧。即a
和b
中的结果将基于先前值的计算(在此行之前)。虽然第二个代码完全按顺序执行,但第二行使用第一行中获得的值进行评估。
答案 1 :(得分:0)
第一个返回右手值(a + b)的评估结果并将其用于分配。也就是说,评估(a + b)和THEN赋值(a = b)和(b =结果) 而第二个覆盖" a"在它可用于你的等式之前。
即循环使用以下内容:
a=b
b=a+b
结果是:
a = 0, b = (0 + 1), print a: 0
a = 1, b = (1 + 1), print a: 1
a = 2, b = (2 + 2), print a: 2
a = 4, b = (4 + 4), print a: 4
您需要的是临时返回值,因为在评估语句a + b之前,您不想更新a或b的值。
def fib(n):
a = 0
b = 1
for i in range(n):
temp = a + b
a, b = b, temp
print a