说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gr99123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
在 Python 中,__closure__
是一个函数属性,用于检查函数是否是闭包并访问闭包的自由变量(free variables)。闭包是指一个函数中包含了对在函数外部定义的非全局变量的引用,然后该函数被返回或者传递给另一个函数。当一个函数是闭包时,它的__closure__
属性将返回一个包含了对自由变量的引用的元组,如果函数不是闭包,__closure__
将返回None。
__closure__
返回的是 None 或是一个包含该函数的自由变量的绑定单元的 tuple。单元对象具有 cell_contents 属性。这可被用来获取以及设置单元的值。
下面是一个简单的示例:
def outer_function(x):
y = 10
z = 20
def inner_function():
return x + y + z
return inner_function
closure_example = outer_function(5)
print(closure_example)
# <function __main__.outer_function.<locals>.inner_function()>
print(closure_example.__closure__)
'''
(<cell at 0x1293c7010: int object at 0x10ef00dd8>,
<cell at 0x1293c7d30: int object at 0x10ef00e78>,
<cell at 0x1293c6ef0: int object at 0x10ef00fb8>)
'''
# 检查函数是否是闭包
if closure_example.__closure__:
print("This function is a closure.")
else:
print("This function is not a closure.")
# This function is a closure.
# 访问闭包的自由变量
if closure_example.__closure__:
for i, cell in enumerate(closure_example.__closure__):
print(f"Free variable {i}: {cell.cell_contents}")
'''
Free variable 0: 5
Free variable 1: 10
Free variable 2: 20
'''
在这个例子中,outer_function 是一个闭包,因为inner_function引用了outer_function中定义的变量x、y和z。closure_example是outer_function的返回值,它指向了inner_function。我们检查了closure_example的__closure__
属性,确认了它是一个闭包,并且访问了闭包中的自由变量。
在这个例子中,自由变量指的是在内部函数 inner_function 中被引用但未在其内部定义的变量,即 x、y 和 z。这些变量被称为自由变量,因为它们的值是在外部函数 outer_function 中定义的,而不是在 inner_function 中。
具体来说:
这些变量在 inner_function 中可以被访问和使用,尽管它们不是 inner_function 的本地变量,而是从外部函数中捕获(capture)的自由变量。这就是闭包的特性之一:内部函数可以访问外部函数中的变量,即使外部函数已经返回了。
https://docs.python.org/zh-cn/3/reference/datamodel.html#function.__closure__
更新时间:2024-03-03 09:26:37 标签:python 特殊属性 全局变量