鱼C论坛

 找回密码
 立即注册
查看: 2822|回复: 9

代码理解

[复制链接]
发表于 2016-4-13 10:17:38 | 显示全部楼层 |阅读模式

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

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

x
下面这段代码为什么打印出来的是6 6 6 6,而不是0 2 4 6
  1. fun_list = []
  2. for i in range(4):
  3.     def fun(x):
  4.         return i*x
  5.     fun_list.append(fun)
  6.    
  7. for f in fun_list:
  8.     print f(2)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-4-13 11:13:17 | 显示全部楼层
本帖最后由 小小大鱼 于 2016-4-13 20:56 编辑

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

使用道具 举报

发表于 2016-4-13 11:15:49 | 显示全部楼层
稍微注释了一下,希望有帮助:
  1. fun_list = []
  2. for i in range(4):
  3.     def fun(x):
  4.         return i*x
  5.     fun_list.append(fun)

  6. #注意执行到这里的时候, i=3
  7. for f in fun_list:
  8. #f(2)会返回i和2的乘积
  9.     print f(2)
复制代码

对比下面这一个代码应该能想的更清楚:
  1. fun_list = []
  2. for i in range(4):
  3.     def fun(x):
  4.         return i*x
  5.     fun_list.append(fun)
  6.    
  7. for i in range(4):
  8.     print(fun_list[i](2))
复制代码

下面代码的输出就是0,2,4,6了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2016-4-13 14:14:02 | 显示全部楼层
可以理解成后期绑定

在 fun 调用之前
fun 永远 = i * x
那在调用的时候
才去 fun的上下文寻找 i
所以  就是后期绑定

你最后在调用的时候  i已经是3了
所以结果都是3*x

评分

参与人数 1荣誉 +20 鱼币 +20 贡献 +5 收起 理由
hldh214 + 20 + 20 + 5 热爱鱼C^_^

查看全部评分

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

使用道具 举报

 楼主| 发表于 2016-4-13 16:37:48 | 显示全部楼层
本帖最后由 yueye1104 于 2016-4-13 16:47 编辑
小小大鱼 发表于 2016-4-13 11:13
表面上看,fun_list列表中有四个函数对象,事实是这是对同一函数的四次引用。

这样说你可能比较容易明白 ...


为什么说fun_list中四个对象指向同一个函数,我检查了下fun_list中函数的id,发现都不一样,该怎样理解
  1. >>> id(fun_list[0])
  2. 2649821787000
  3. >>> id(fun_list[1])
  4. 2649821787136
  5. >>> id(fun_list[2])
  6. 2649821787272
  7. >>> id(fun_list[3])
  8. 2649821787408
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-13 16:57:43 | 显示全部楼层
holdme 发表于 2016-4-13 11:15
稍微注释了一下,希望有帮助:

对比下面这一个代码应该能想的更清楚:

第二个例子我能理解,第一个例子中我不明白的地方是fun_list既然是一个list,那么它就是一个可迭代对象,为什么在for循环过程中,只有3*x参与了进来
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-13 17:15:51 | 显示全部楼层
阿狸爱吃鱼 发表于 2016-4-13 14:14
可以理解成后期绑定

在 fun 调用之前

谢谢你让我理解到了后期绑定的概念,就是说定义一个函数的时候,函数内部的变量并不是立刻把值给绑定,而是在等调用的时候再查找这个变量,fun_list里面fun都是i*x,调用的时候,i=3,所以都会返回6
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-13 18:34:09 | 显示全部楼层
阿狸爱吃鱼 发表于 2016-4-13 14:14
可以理解成后期绑定

在 fun 调用之前

啊哈哈~~
哇塞  20个鱼币
谢谢hldh214~~~~~
太慷慨了!!!!多谢多谢!
@hldh214
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-13 20:57:46 | 显示全部楼层
yueye1104 发表于 2016-4-13 16:37
为什么说fun_list中四个对象指向同一个函数,我检查了下fun_list中函数的id,发现都不一样,该怎样理解
...

我又查了下,发现我那理解是错误的,抱歉。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-17 16:34:47 | 显示全部楼层
学习了!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-20 16:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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