为了账号安全,请及时绑定邮箱和手机立即绑定

求助求助,闭包和匿名两节课中的问题

def count():
    fs = []
    for i in range(1, 4):
        fs.append(lambda i=i: i*i)
    return fs

f1, f2, f3 = count()
print f1(), f2(), f3()
#这个代码可以正确的显示出1,4,9

def count():
    fs = []
    for i in range(1, 4):
        fs.append(lambda a=i: i*i)
    return fs

f1, f2, f3 = count()
print f1(), f2(), f3()
#然而这个代码只能显示出9,9,9

def count():
    fs = []
    for i in range(1, 4):
        fs.append(lambda i: i*i)
    return fs

f1, f2, f3 = count()
print f1(), f2(), f3()
#这个代码会报错

谁能解释下这是为什么呢?


正在回答

1 回答

初学,不知道解释的对不对啊

第一个问题:

fs.append(lambda i=i: i*i) 相当于 fs.append(lambda j=i: j*j)

(lambda i=i: i*i)中的第一个 i 是lambda自己声明的局部变量 , 会屏蔽掉外部的 i 变量值。

第二个问题:

fs.append(lambda a=i: i*i) 相当于 fs.append(lambda : i*i)

(lambda a=i: i*i) 中的 i是引用外部变量 ,所以会发生变化,闭包要求不是不能引用外部会发生变化的变量么

第三个问题:

fs.append(lambda i: i*i)  中相当于

def f(i):

    return i*i

fs1.append(f)

然后后面的 print f1(), f2(), f3() 函数中都没有传入参数,改为print f1(1), f2(2), f3(3) 就不会报错

fs.append(lambda i: i*i)  中的 i 是lambda自己声明的局部变量,会屏蔽外部的变量 i。

 

1 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
python进阶
  • 参与学习       255665    人
  • 解答问题       2949    个

学习函数式、模块和面向对象编程,掌握Python高级程序设计

进入课程

求助求助,闭包和匿名两节课中的问题

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信