笨鸟编程-零基础入门Pyhton教程

 找回密码
 立即注册
查看: 7328|回复: 2

[已经解决] 一个python小疑惑

[复制链接]

新手上路

Rank: 1

积分
3
发表于 2022-3-8 15:58:12 | 显示全部楼层 |阅读模式

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

  8. a = funX()
  9. print(a())
  10. print(a())
  11. print(a())
复制代码
为什么这个输出 6,7,8

  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()())
复制代码
而这个输出的是 6,6,6。

这不是应该是一样的吗?不是很理解。
495175557已获得悬赏 10 C币

最佳答案

首先a=funX() a就是funX()运行结果funYd的函数地址,同时x=5运行了一次 而a()并不包括x=5重置的部分,因此每次x分别加了1 后面的因为运行的是每次的funX函数,然后再闭包,这里x都有重置为5 ...
回复

使用道具 举报

新手上路

Rank: 1

积分
12
发表于 2022-3-8 15:58:28 | 显示全部楼层
首先a=funX()
a就是funX()运行结果funYd的函数地址,同时x=5运行了一次
而a()并不包括x=5重置的部分,因此每次x分别加了1

后面的因为运行的是每次的funX函数,然后再闭包,这里x都有重置为5
回复

使用道具 举报

新手上路

Rank: 1

积分
2
发表于 2022-3-8 15:58:35 | 显示全部楼层

a = funX() #实例化a,说明nonlocal x在内存中有了地址,每次执行都会+1
print(a())
print(a())
print(a())


print(funX()())  #没实列化化, 第次调用都是原来的值
print(funX()())
print(funX()())


单看这里也不应该输出一样的吧。
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|笨鸟自学网 ( 粤ICP备20019910号 )

GMT+8, 2024-12-12 05:01 , Processed in 0.053003 second(s), 24 queries .

© 2001-2020

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