ME_TWM 2018-01-31 07:11 采纳率: 0%
浏览 818
已结题

关于python闭包结构的问题

count1和count3得出的结果不一样,请问为什么?

def count1():

def f(j):
def g():
return j*j
return g
fs = []
for i in range(1, 4):
fs.append(f(i))

return fs

结果:1 4 9

def count3():
fs = []
for i in range(1, 4):
def f(j):
def g():
return j*j
return g
fs.append(f(i))
return fs

结果:9 9 9

原谅我小白。。。

  • 写回答

3条回答 默认 最新

  • 沉迷WebRTC 2018-01-31 09:00
    关注
     # 希望一次返回3个函数,分别计算1x1,2x2,3x3:  
    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()  
    

    当count()函数返回三个函数时,**这三个变量所引用的变量i的值已经变成了3**,因为在返回的时候三个函数并没有被调用,所以此时它们并没有及时计算它们对应的i乘以i的值,等到三个函数都返回时,然后调用三个函数,此时i的值已经为3,计算i乘以i的值自然就都是9了.

    所以在返回闭包的情况下,我们一定要注意的一点就是:

    返回函数千万不要引用任何一个循环变量,或者在之后会发生改变的变量.
    当然对于这种情况我们还是有解决方法的.我们在内层函数f()内再定义一个内层函数g(),用这个函数的参数绑定循环变量的当前值,这样的话,无论循环变量之后如何改变,每一次循环中的循环变量i的值就都保存在了第三层函数g()中,如此得到了我们期望的输出结果.(也就是你的第一种方法)

    评论

报告相同问题?

悬赏问题

  • ¥15 python的qt5界面
  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100