Python闭包注意问题

先看一个例子:
定义了一个函数f1,然后f1的内部定义了一个局部的变量a = 10,然后定义了一个函数f2,f2的内部对a重新赋值,重新赋值之后在f2的内部打印了a的值,f2定义完了之后,然又回到f1的内部,打印a的值,接着又在f1的内部调用一下f2,最后又打印了a的值,最后在整个的f1外部,模块中整体的调用f1

def f1():
    a = 10
    def f2():
        a = 20
        print(a)
    print(a)
    f2()
    print(a)

f1()
---------------------------
输出:
10
20
10

f2中的打印a的值是10,这是因为f2中定义的apython认为是一个局部变量。局部变量并不会影响到外部变量。所以执行f2的打印结果还是10,而在f1内部打印结果是20

那么,这个函数是闭包函数么?可以试试。可以把print去掉,简要写一些

def f1():
    a = 10
    def f2():
        a = 20
    return f2

f = f1()
print(f.__closure__)
-----------------------------
输出:
None

没有任何值,显然这并不是一个闭包函数。
闭包 = 函数 + 环境变量(函数定义时候)
只有函数,而没有环境变量,肯定没任何东西。

好,那换一种写法

def f1():
    a = 10
    def f2():
        a = 20
    return a

f = f1()
print(f.__closure__)
-------------------------------------------
输出:
Traceback (most recent call last):
  File "E:/projects/python_learn/eleven/c11.py", line 15, in <module>
    print(f.__closure__)
AttributeError: 'int' object has no attribute '__closure__'

return a也还是报错的,
注意:环境变量a是要被引用的,并不是重新赋值,也不是return

def f1():
    a = 10
    def f2():
        x = a*10
    return f2


f = f1()
print(f.__closure__)
-------------------------------
输出:
(<cell at 0x0000000001E08498: int object at 0x000000005A6FA580>,)

闭包 = 函数 + 环境变量(函数定义时候)。
而,环境变量是要被引用的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值