为什么当我运行 a fib() in python 时a, b = b, a + b 不等于a = b, b = a + b?
Why a, b = b, a + b is not equal to a = b, b = a + b when I running a fib() in python?
我是 python 编程新手,我正在尝试编写基于生成器的 fib。我试过这个:
def fib(n):
a = 0
b = 1
for _ in range(n):
yield a
print(a)
a, b = b, a + b
print((a,b))
还有这个:
def fib(n):
a = 0
b = 1
for _ in range(n):
yield a
a = b
b = a + b
print(list(fib(a)))
结果不一样,为什么会这样?
一步一步找出答案!
a = 0
b = 1
# loop starts: # loop starts
yield a # yields 0, a=0, b=1 yield a # yields 0, a=0, b=1
a = b # a=1, b=1 a, b = b, b+a # a=1, b=1
b = a + b # a=1, b=2
# loop
yield a # yields 1, a=1, b=2 yield a # yields 1, a=1, b=1
a = b # a=2, b=2 a, b = b, b+a # a=1, b=2
b = a + b # a=2, b=4
# loop
yield a # yields 2 a=2, b=4 yield a # yields 1, a=1, b=2
a = b # a=4, b=4 a, b = b, b+a # a=2, b=3
b = a + b # a=4, b=8
# etc...
Python 不会破坏这个
a, b = b, a + b
进入这个:
a = b
b = a + b
相反,Python 编译器首先通过转换以下表达式来评估表达式的右手:
a = 0
b = 1
a, b = b, a + b
进入这个:
a = 0
b = 1
a, b = 1, 1
然后按正确的顺序赋值。
所以 a
和 b
变成 1.
我是 python 编程新手,我正在尝试编写基于生成器的 fib。我试过这个:
def fib(n):
a = 0
b = 1
for _ in range(n):
yield a
print(a)
a, b = b, a + b
print((a,b))
还有这个:
def fib(n):
a = 0
b = 1
for _ in range(n):
yield a
a = b
b = a + b
print(list(fib(a)))
结果不一样,为什么会这样?
一步一步找出答案!
a = 0
b = 1
# loop starts: # loop starts
yield a # yields 0, a=0, b=1 yield a # yields 0, a=0, b=1
a = b # a=1, b=1 a, b = b, b+a # a=1, b=1
b = a + b # a=1, b=2
# loop
yield a # yields 1, a=1, b=2 yield a # yields 1, a=1, b=1
a = b # a=2, b=2 a, b = b, b+a # a=1, b=2
b = a + b # a=2, b=4
# loop
yield a # yields 2 a=2, b=4 yield a # yields 1, a=1, b=2
a = b # a=4, b=4 a, b = b, b+a # a=2, b=3
b = a + b # a=4, b=8
# etc...
Python 不会破坏这个
a, b = b, a + b
进入这个:
a = b
b = a + b
相反,Python 编译器首先通过转换以下表达式来评估表达式的右手:
a = 0
b = 1
a, b = b, a + b
进入这个:
a = 0
b = 1
a, b = 1, 1
然后按正确的顺序赋值。
所以 a
和 b
变成 1.