找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 2859|回复: 3

[求助] 关于闭包问题,求大佬帮忙解释

3

主题

6

帖子

6

积分

贫民

积分
6
Witheri_HvY7c 发表于 2019-6-2 22:22:23 | 显示全部楼层 |阅读模式
#定义空列表
fs = []
#创建多个函数
for i in range(3):
    def foo(x):
        #将i * i作为返回值,返回给foo()
        return i + x
    #将foo作为参数添加到列表fs中
    fs.append(foo)
for a in fs:
    #执行fs列表中第一个数据,并将x赋值为0
#    print(a(0))
    #执行fs列表中第一个数据,并将x赋值为1
#    print(a(1))
    #执行fs列表中第一个数据,并将x赋值为2
    print(a(0),a(1),a(2))
求问大佬,为什么单独打印a(0)的时候,i=2,结果为222;但是一起打印(a(0),a(1),a(2))的时候,结果却为234,234,234,也就是说结果a(0)却为234
回复

使用道具 举报

0

主题

1

帖子

1

积分

贫民

积分
1
竹风抚荷塘 发表于 2019-7-2 20:04:30 | 显示全部楼层
因为你定义的foo函数里面,i延时绑定了,i永远为2。
倒是你的fs列表里面,所有的函数都是 "return 2+x"。
最后的输出应该为:
2
3
234
2
3
234
2
3
234
回复 支持 反对

使用道具 举报

1

主题

2

帖子

2

积分

贫民

积分
2
czcc 发表于 2019-8-13 18:38:21 | 显示全部楼层
二楼说的对,i在foo函数里面是恒定的值 2 。
fs是函数的集合列表
遍历
分别将参数代入 也就是
fs[0](0)     
fs[0](1)     
fs[0](2)     

---------------
fs[1](0)
fs[1](1)
fs[1](2)
-----------------
fs[2](0)
fs[2](1)
fs[2](2)
回复 支持 反对

使用道具 举报

4

主题

15

帖子

15

积分

贫民

积分
15
gzh888666 发表于 2020-4-24 15:59:05 | 显示全部楼层
这个和闭包没半毛钱的关系!
回复 支持 反对

使用道具 举报

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

本版积分规则

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