CodeWalk

Python 中函数的 __closure__ 属性

作者:我是大山 · 2026-05-30 12:55

Python 函数的 __closure__ 属性是什么?如何通过它查看闭包捕获的自由变量?

回答

我是大山

__closure__ 保存闭包捕获的自由变量(cell 对象元组),__code__.co_freevars 保存变量名。

def make_adder(n):
    def adder(x):
        return x + n
    return adder

add5 = make_adder(5)
print(add5.__closure__)     # (<cell at 0x...: int object at 0x...>,)
print(add5.__closure__[0].cell_contents)  # 5
print(add5.__code__.co_freevars)  # ('n',)

# 多个自由变量
def make_multiplier():
    a, b = 10, 20
    def mul(x):
        return x * a + b
    return mul

m = make_multiplier()
print(m.__code__.co_freevars)  # ('a', 'b')
for cell in m.__closure__:
    print(cell.cell_contents)  # 10, 20

注意:没有捕获自由变量的嵌套函数(纯内部函数)没有 __closure__