鱼C论坛

 找回密码
 立即注册
查看: 1351|回复: 5

[已解决]急求有关python详细的解答,谢谢

[复制链接]
发表于 2018-1-9 21:25:31 | 显示全部楼层 |阅读模式

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

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

x
>>>def funX():
             x = 5
            def funY():
                 nonlocal x
                 x += 1
                return x
     return funY

#调用函数方法1
>>>a = funX()
>>>print(a())
>>>print(a())
>>>print(a())
#返回结果分别是
6
7
8

#调用函数方法2
>>>funX()()
>>>funX()()
>>>funX()()
#返回的结果分别是:
6
6
6

个人没有理解,请大家帮忙看看,且>>> id(a)返回的结果为37357944        >>> id(funX())返回的结果为37358232。为何两个地址不一样?为何两种调用函数的结果也不一致?
最佳答案
2018-1-9 21:40:33
这是函数闭包的用法。
方法1,a=fuX(),只执行到x=5这一步,每次执行a(),都是执行funY,使x加一,就会有结果6,7,8
方法2,相当于执行了funX和funY,每次执行都先将x变为5,再执行加一,所以输出6,6,6
相当于方法的
>>>a = funX()
>>>print(a())
6
再执行
>>>a = funX()
>>>print(a())
6 #还是6

至于你说id不同,我们做如下的测试
>>> a = funX()
>>> b = funX()
>>> a()
6
>>> a()
7
>>> b()
6
a和b都是funX(),但多次a(),不影响b(),说明每次调用funX()是在不同地址生成新的函数调用,使得各自的调用都是独立的。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-1-9 21:39:14 From FishC Mobile | 显示全部楼层
一个是使用函数指针,一个是函数本身
函数本身每次调用都会压栈弹栈,所以都是6
而指针没有类似的栈操作
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-9 21:40:33 | 显示全部楼层    本楼为最佳答案   
这是函数闭包的用法。
方法1,a=fuX(),只执行到x=5这一步,每次执行a(),都是执行funY,使x加一,就会有结果6,7,8
方法2,相当于执行了funX和funY,每次执行都先将x变为5,再执行加一,所以输出6,6,6
相当于方法的
>>>a = funX()
>>>print(a())
6
再执行
>>>a = funX()
>>>print(a())
6 #还是6

至于你说id不同,我们做如下的测试
>>> a = funX()
>>> b = funX()
>>> a()
6
>>> a()
7
>>> b()
6
a和b都是funX(),但多次a(),不影响b(),说明每次调用funX()是在不同地址生成新的函数调用,使得各自的调用都是独立的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-9 23:07:54 | 显示全部楼层
冬雪雪冬 发表于 2018-1-9 21:40
这是函数闭包的用法。
方法1,a=fuX(),只执行到x=5这一步,每次执行a(),都是执行funY,使x加一,就会有结 ...

谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-9 23:08:49 | 显示全部楼层
BngThea 发表于 2018-1-9 21:39
一个是使用函数指针,一个是函数本身
函数本身每次调用都会压栈弹栈,所以都是6
而指针没有类似的栈操作

谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-10 20:13:21 | 显示全部楼层
BngThea 发表于 2018-1-9 21:39
一个是使用函数指针,一个是函数本身
函数本身每次调用都会压栈弹栈,所以都是6
而指针没有类似的栈操作

谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-5 17:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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