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
中定义的a
被python
认为是一个局部变量。局部变量并不会影响到外部变量。所以执行f2
的打印结果还是10
,而在f1
内部打印结果是20
。
那么,这个函数是闭包函数么?可以试试。可以把
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>,)
闭包 =
函数
+环境变量
(函数定义时候)。
而,环境变量是要被引用的。