鱼C论坛

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

[已解决]函数默认值的问题

[复制链接]
发表于 2018-3-7 17:42:33 | 显示全部楼层 |阅读模式

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

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

x
  1. def funX():
  2.     x = 5
  3.     def funY():
  4.         nonlocal x
  5.         x += 1
  6.         return x
  7.     return funY

  8. print(funX()())
  9. print(funX()())
  10. print(funX()())
  11. a = funX()
  12. print(a())
  13. print(a())
  14. print(a())
复制代码


  1. x = 5
  2. def f():
  3.     global x
  4.     x += 1
  5.     return x
  6. print(f())
  7. print(f())
  8. print(f())
  9. b = f()
  10. print(b)
  11. print(b)
  12. print(b)
复制代码



为什么闭包赋值后和普通函数赋值后恰好相反,普通函数不会再变化,而闭包开始在前一个值的基础上变化。
最佳答案
2018-3-7 18:24:33
1.普通函数:
f() 指向的是每次运行函数后返回的值。
a = f() , a 指向的是第一次运行函数后返回的值。

2.闭包
funX()()每次运行都会将 x 重新赋值为 5,所以最后都是返回 6。
a = funX(), a() 则每次都运行的是 funX() 函数里的 funY(),并没有运行到外面的 x = 5,所以每次都会加 1。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-3-7 18:24:33 | 显示全部楼层    本楼为最佳答案   
1.普通函数:
f() 指向的是每次运行函数后返回的值。
a = f() , a 指向的是第一次运行函数后返回的值。

2.闭包
funX()()每次运行都会将 x 重新赋值为 5,所以最后都是返回 6。
a = funX(), a() 则每次都运行的是 funX() 函数里的 funY(),并没有运行到外面的 x = 5,所以每次都会加 1。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-7 18:57:48 | 显示全部楼层
°蓝鲤歌蓝 发表于 2018-3-7 18:24
1.普通函数:
f() 指向的是每次运行函数后返回的值。
a = f() , a 指向的是第一次运行函数后返回的值。

为啥闭包中a = funX()()不是和a = f()一样指向第一次的值
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-7 19:06:38 | 显示全部楼层
纸人无敌 发表于 2018-3-7 18:57
为啥闭包中a = funX()()不是和a = f()一样指向第一次的值

因为 funX()() 是函数里的函数, 而 f() 是函数。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-7 19:13:43 | 显示全部楼层
°蓝鲤歌蓝 发表于 2018-3-7 19:06
因为 funX()() 是函数里的函数, 而 f() 是函数。

之前看错了。
哪里不是指向第一次的值?
a = funX()()  然后你输入几次 print(a),你看看是不是都指向 6。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-7 20:06:09 | 显示全部楼层
°蓝鲤歌蓝 发表于 2018-3-7 19:13
之前看错了。
哪里不是指向第一次的值?
a = funX()()  然后你输入几次 print(a),你看看是不是都指向  ...

啊,不,是我打错了。。。。不过我好像懂了,谢谢啦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-8 07:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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