欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python闭包注意问题

程序员文章站 2022-04-03 22:50:52
...

先看一个例子:
定义了一个函数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>,)

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

相关标签: Python闭包函数