caeser 发表于 2023-2-15 20:44:33

为什么结果不一样?

在做第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
>>>
各位大神,我到底哪里错了呢?

isdkz 发表于 2023-2-15 20:52:47

把 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

caeser 发表于 2023-2-15 21:04:47

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:11:57

本帖最后由 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 自动帮你完成了值的暂存

BrightXiong 发表于 2023-2-15 21:27:19

最佳回答
页: [1]
查看完整版本: 为什么结果不一样?