鱼C论坛

 找回密码
 立即注册
查看: 44|回复: 3

[已解决]闭包函数对嵌套函数引用的问题

[复制链接]
发表于 昨天 16:12 | 显示全部楼层 |阅读模式

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

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

x
  1. def fun():
  2.     x = 880
  3.     def funny():
  4.         print(x)
  5.     return funny

  6. fun()
  7. <function fun.<locals>.funny at 0x0000023779332200>
  8. fun()
  9. <function fun.<locals>.funny at 0x0000023779332520>
  10. fun()
  11. <function fun.<locals>.funny at 0x00000237793325C0>
  12. fun()
  13. <function fun.<locals>.funny at 0x00000237793323E0>
  14. fun()
  15. <function fun.<locals>.funny at 0x0000023779332340>
  16. fun()
  17. <function fun.<locals>.funny at 0x0000023779332200>
  18. fun()
  19. <function fun.<locals>.funny at 0x00000237793323E0>
复制代码

课程上说此时调用fun()是对funny()函数的引用,为什么每一次调用fun()返回的引用都不一样啊,求解惑
最佳答案
昨天 17:21
每次调用外部函数都会生成全新的闭包函数对象
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 昨天 16:13 | 显示全部楼层
在Python中,每次调用外部函数 fun() 时,都会创建一个[red]新的内部函数实例[/red],即使它们的代码完全相同。这是因为:

1. 每次调用 fun() 时:
   - 都会创建新的局部变量 x = 880
   - 都会[red]重新定义[/red]一个全新的 funny 函数
   - 返回的是[red]新创建的[/red] funny 函数对象

2. 验证差异(用id查看内存地址):

  1. f1 = fun()
  2. f2 = fun()
  3. print(id(f1))  # 输出示例:140123456
  4. print(id(f2))  # 输出示例:140789012 → 地址不同
  5. print(f1 is f2)  # 输出 False → 不是同一个对象
复制代码


3. 闭包本质:
每个返回的 funny 都是独立的闭包,它们各自"记住"的是[red]不同时刻[/red]创建的变量 x(虽然值相同,但存储位置不同)

4. 执行效果相同的原因:
虽然函数对象不同,但执行结果相同,因为它们都绑定了值为880的变量:

  1. f1()  # 输出880
  2. f2()  # 输出880 → 结果相同但函数对象不同
复制代码


总结:每次调用外部函数都会生成全新的闭包函数对象,这是Python函数的正常行为。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 昨天 17:21 | 显示全部楼层    本楼为最佳答案   
每次调用外部函数都会生成全新的闭包函数对象
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 17:25 | 显示全部楼层
其实更本质的原因是你使用了交互式,每次都重新运行了

以下是你要的效果,输出全一样
  1. def fun():
  2.     x = 880
  3.     def funny():
  4.         print(x)
  5.     return funny
  6. for i in range(100):
  7.     print(fun())
复制代码


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-2 19:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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