鱼C论坛

 找回密码
 立即注册
查看: 2780|回复: 4

[已解决]为什么结果不一样?

[复制链接]
发表于 2023-2-15 20:44:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在做第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
>>>
各位大神,我到底哪里错了呢?
最佳答案
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 自动帮你完成了值的暂存
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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 这个就是成立的呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 自动帮你完成了值的暂存
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-15 21:27:19 | 显示全部楼层
最佳回答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-16 12:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表