鱼C论坛

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

作用域与带有循环变量的默认参数相比较问题

[复制链接]
发表于 2018-5-1 09:22:12 | 显示全部楼层 |阅读模式

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

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

x
2018-05-01 09-13-43屏幕截图.png
为什么在这个循环中产生的函数将会有相同的值,也就是在最后一次循环中完成时被引用变量的值?
我们再来看下另一个例子:
2018-05-01 09-21-13屏幕截图.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-5-1 09:29:28 | 显示全部楼层
你append里面的lambda表达式x,i写反了
  1. lambda x:x**i
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-1 09:35:08 | 显示全部楼层
alltolove 发表于 2018-5-1 09:29
你append里面的lambda表达式x,i写反了

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

使用道具 举报

发表于 2018-5-1 09:58:14 | 显示全部楼层

哦,还真是,这python比较复杂,你最好别这样做,用我这个方法吧还是
  1. def a(n):
  2.         return [n*i for i in range(5)]


  3. f=a(3)
  4. print(f)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-1 10:04:20 | 显示全部楼层
其实我怀疑py优化过?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-1 19:00:40 | 显示全部楼层
这个解释起来有点复杂,上面2张图中使用的lambda,实际上都是闭包,
闭包函数使用到了enclosed的变量时,都会在自己的local开辟空间存储对应的值,图一因为没有赋值操作,实际上就是直接指向
for i in range(5) 中的 i 变量 ,会随着 i = 0 , i = 1 ...一直变化, 所以其实append进去的值都是一样的 ,
你在执行 acts = 函数() 的时候,函数中的 i 已经指向了4,

而对于图二中,因为有赋值操作 i = i 实际上就相当于,在lambda函数的内部(local空间)创建了一个新标签,直接指向了 for in 函数中,变量 i 指向的值

这是一个动态变化的过程,几句话确实不好描述,希望多多少少有点帮助

其实这个算是一道比较常考的,有关闭包的面试题,建议先了解下Python的名字空间的查找优先级,
因为Python中其实是没有变量这个概念的,都是以字典的形式存在,用标签去理解比变量的盒子理解容易些

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-29 20:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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