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

函数闭包有点不懂啊,大神帮我看看

def count():

    fs = []

    for i in range(1, 4):

        def f():

             return i*i

        fs.append(f)

    return fs

f1, f2, f3 = count()

print(f1(),f2(),f3())

为什么i就会被调用成3呢,为啥不会顺着下去i*i这样,能不能给个清晰点的解释

正在回答

3 回答

for循环在执行的时候,i的值分别为1 2 3,但是函数f并没有被调用过,

所以函数f中的return i * i语句并没有改变过,它只是return i * i

而不是return 1 * 1 或 return 2 * 2 或 return 3 * 3


在执行到fs.append(f)语句时,也只是把函数f添加到fs中3次,

添加时函数f中的内容仍然是return i * i

而不是return 1 * 1 或 return 2 * 2 或 return 3 * 3


只有当函数f被调用时,才会去获取i的值,这个时候for循环早已结束,i的值也已经是3了

>>> f1, f2, f3 = count()            # 变量f1,f2,f3分别指向fs中的3个f函数
>>> f1
<function f at 0x7fef19c93c08>                
>>> f2
<function f at 0x7fef19c93c80>
>>> f3
<function f at 0x7fef19c93cf8>
>>> print f1(),f2(),f3()	    # 分别调用3个f函数
9 9 9


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

要注意【调用】这个动作,代码进行到fs.append(f)这个阶段实际上f函数没有调用i的值去计算,只是返回函数f,最后print(f1(),f2(),f3())时才会调用i的值进行计算,这时经过循环i的值已经变为3了

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

我也刚看完,自己测试了下,确实输出的都是9,按他们的意思应该是 循环变量 循环完以后,闭包里的i乘i其实是没执行的,所以i才是最有一个值3,任务里的是对的,需要单独把1,2,3赋值,

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

慕仔8323353 提问者

可是当我把range(1,4)改为其他的时候,为什么显示错误,而且是f1,f2,f3=count()的错误?
2018-10-24 回复 有任何疑惑可以回复我~
#2

生活丶生活 回复 慕仔8323353 提问者

列表返回的是函数
2018-10-30 回复 有任何疑惑可以回复我~
#3

qq__eqwGTW 回复 慕仔8323353 提问者

1,4意思是有3个值,1,2,3,,不包括最后一个,你改成5,就是1,2,3,4,知道了吧
2018-10-31 回复 有任何疑惑可以回复我~
#4

Shu澍

请问没执行为什么i等于3了?这里面具体i的变化流程是什么样子呢??
2019-01-25 回复 有任何疑惑可以回复我~
查看1条回复

举报

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

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

进入课程

函数闭包有点不懂啊,大神帮我看看

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