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

这个参考代码里的j不也是在变么

这个参考代码里的j不也是在变么,为什么不会像讲解的那样跟用i时一样呢

正在回答

3 回答

i和j的性质是不一样的,i是在count这个函数作用域中的变量,而j是函数f作用域里面的变量,举个例子:

https://img1.sycdn.imooc.com//5b7cb3de0001533e15520668.jpg

https://img1.sycdn.imooc.com//5b7cb3c900017b8213940642.jpg

https://img1.sycdn.imooc.com//5b7cb37d00015e0f14401080.jpg

最主要的区别就是i在闭包里面置存储了一个request的permission,而j存储的是一个确切的值

1 回复 有任何疑惑可以回复我~
# -*- coding:utf-8 -*-
def count():    
    fs = []    
    for i in range(1, 4):        
        def f(j):            
            def g():                
                print 'j=',j,'now'                
                return ‘result=',j*j            
            return g
        r = f(i)        
        fs.append(r)    
    return fs

f1, f2, f3 = count()
print '此行表示以下的输出都在f1,f2,f3被调用时产生:'
print f2(),'\n',f1(),'\n', f3(),'\n'

这段程序跟参考代码比改变了第1行(为了将后面的汉字打出来),第7行(输出此次调用的j值),第8行,第15行(表示打印出的结果都是在调用函数后产生的),第16行(加\n是为了把各个函数的结果隔开,将f2()放到了最前面,表明j的值是被固定在函数结果里的)。

输出结果:

https://img1.sycdn.imooc.com//5b62766700011f3903980150.jpg

这个结果说明,在每一轮for循环中,当函数f(j)【j=i,i为具体数值而非变量】把g返回给r的时候,此时i赋给j的值已经被‘锁死’在g里了。

即,最终加入到fs中的不是三个【j*j】,而是【j=i=1     j*j】、【j=i=2    j*j】和【j=i=3     j*j】。

不知道这个结果是不是与j是局部变量有关?

因为本人也是小白,只能从外围现象来猜测原因,期待有大神可以从python内部来进行解答:)

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

参考代码里面是套用了一个闭包,在内部函数返回之后,j的值并不变化,只有下次调用函数f的时候,传进来一个新的参数,j的值才会改变,但这个时候f函数早已返回了,就不再影响内部函数g了。这是我的理解,希望能帮到你,加油!

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

举报

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

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

进入课程

这个参考代码里的j不也是在变么

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