关于python中的闭包与for循环(可变变量)的矛盾以及如何避免

本文只讲一个重点:闭包与for循环之间的矛盾以及避免的方法,关于闭包的概念,请参考网上的概念

废话不多说来看以下代码:

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

f1, f2, f3 = count()

如上所示,很经典的闭包使用,那么如果我们执行f1()并且打印它的返回值答案会是多少,我想很多人会认为是1,但结果不尽人意,我们打印出f1,f2,f3的值我们发现答案竟然是一样的都是9,原因在于闭包中,那个被返回的函数并没有立即执行,而是以某种方式保存了下来,其实,在生活中,就好比你有一个苹果,当你咬下一口让它暴露在空气中以后,再次使用(吃)会被氧化发生了改变一样,闭包的关键在于函数内部能够调用外部的数据,但这些数据的值一定要以最终的形态被内部函数调用,上述代码中,当执行f()时(吃到苹果)那个外部的变量才不会再发生改变,但是在count内部调用不到f()函数所以只能以最后for循环结束的那个3作为i传入

如果一个苹果在外面暴露的太厉害有什么解决方法可以防止苹果氧化吗?

解决方法就是我们把苹果包在一个袋子里这样,就可以减慢氧化的速度,其实解决这个问题也是这样,在f函数外面加一层保护膜:

def count():
    def f(j):
        def g():
            return j*j
        return g
    fs = []
    for i in range(1, 4):
        fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f()
    return fs

在外面的函数中加一个参数绑定当前的i值,我们这样就可以有效的防止闭包的弊端,能够实时的将i的值传给内部函数

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在 Python 使用闭包有以下几点好处: 1. 保存状态:闭包可以保存外部函数的状态,以便在内部函数使用。 2. 简化代码:闭包可以简化代码结构,使得复杂的逻辑变得简单易懂。 3. 模块化编程:闭包可以更好地封装代码,提高代码的可重用性。 4. 保证函数线程安全:闭包可以保证函数的线程安全性,避免全局变量被多线程修改。 ### 回答2: 在Python使用闭包有以下几个好处: 1. 保护数据:闭包可以将函数内部的变量和函数绑定在一起,形成一个封闭的作用域,从而更好地保护数据的隐私性和安全性。外部环境无法直接访问闭包内的变量,只能通过闭包提供的接口来操作数据,从而减少数据被外部误操作的风险。 2. 延长函数的作用域:闭包可以延长函数的作用域,即使函数执行完毕后,其产生的闭包仍然可以访问并使用函数内部的变量。这种特性可以用于保存函数的内部状态,供以后调用时使用,从而实现状态的承载和保持。 3. 节约系统资源:闭包可以避免全局变量的使用,减少对全局命名空间的占用,从而节约系统资源的开销。闭包使得函数成为了一个独立的生命周期,不再需要为每个函数都分配独立的命名空间,从而减少了系统内存的使用。 4. 实现高阶函数:闭包使得函数可以作为另一个函数的参数或返回值,从而实现高阶函数的概念。通过传递闭包,可以在不修改原函数的情况下对其进行扩展和增强,使得代码更加灵活和可复用。 总之,闭包Python语言一种重要的高级特性,可以提供更好的数据封装和保护,延长函数的作用域,节约系统资源,以及实现高阶函数等功能。通过合理利用闭包,可以提高代码的可读性、可维护性和可扩展性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值