为什么结果不一样?
在做第45课动动手作业 :斐波那契数列时发现一个问题:按老师的做法是正确的结果,如下程序:def fib():
num1 = 0
num2 = 1
def fun():
nonlocal num1,num2
temp = num1
num1,num2 = num2,num1+num2
print("temp=",temp,"num1=",num1,"num2=",num2)
return temp
return fun
而我做的是:
def fib():
num1 = 0
num2 = 1
def fun():
nonlocal num1,num2
temp = num1
num1 = num2
num2 = num1+num2
print("temp=",temp,"num1=",num1,"num2=",num2)
return temp
return fun
也就是把 老师的第七行 num1,num2 = num2,num1+num2 写成:
num1 = num2
num2 = num1+num2
得出的结果却是错的:
>>> f=fib()
>>> f()
temp= 0 num1= 1 num2= 2
0
>>> f()
temp= 1 num1= 2 num2= 4
1
>>> f()
temp= 2 num1= 4 num2= 8
2
>>>
老师的结果:
>>> f=fib()
>>> f()
temp= 0 num1= 1 num2= 1
0
>>> f()
temp= 1 num1= 1 num2= 2
1
>>> f()
temp= 1 num1= 2 num2= 3
1
>>>
各位大神,我到底哪里错了呢? 把 num1,num2 = num2,num1+num2 拆开应该是
temp = num1
num1 = num2
num2 = temp+num2
因为 num1 已经被赋值成 num2 了,所以不应该用 num1 + num2 ,而是 temp + num2
def fib():
num1 = 0
num2 = 1
def fun():
nonlocal num1,num2
temp = num1
num1 = num2
num2 = temp+num2
print("temp=",temp,"num1=",num1,"num2=",num2)
return temp
return fun isdkz 发表于 2023-2-15 20:52
把 num1,num2 = num2,num1+num2 拆开应该是
temp = num1
num1 = num2
那为什么 num1,num2 = num2,num1+num2 这个就是成立的呢? 本帖最后由 isdkz 于 2023-2-15 21:14 编辑
caeser 发表于 2023-2-15 21:04
那为什么 num1,num2 = num2,num1+num2 这个就是成立的呢?
因为 num1, num2 = num2, num1 + num2 会把右边的表达式的值放到一个暂存区域,
然后再从暂存区域里面取出值来分别给左边的变量,这是 python 内部机制自动完成的,
而你不要把它拆开的话就要用一个临时变量把值存起来,再从临时变量里面把值取出来,
在下面的代码种 temp 就是这个临时变量
temp = num1
num1 = num2
num2 = temp+num2
就像你要互换两个杯子里的水也不可能两个杯子互相倒一样,得有第三个杯子将其中一个杯子的水存起来,而这个 temp 就是第三个杯子
而在 num1,num2 = num2,num1+num2 中只不过是 python 自动帮你完成了值的暂存
最佳回答
页:
[1]