📜  __closure__ Python中的魔术函数(1)

📅  最后修改于: 2023-12-03 15:29:16.333000             🧑  作者: Mango

Python中的魔术函数 closure

Python中的函数不仅仅是一段可执行的代码,还是一个对象。在Python中,每个函数有一些特殊的属性,如__doc__、namedefaultscode__等。除此之外,还有一个特殊的属性叫__closure,它是一个元组,其中包含了函数所在的环境,也就是函数在定义时的环境。

def outer():
  x = 10
  def inner():
    print(x)
  return inner

foo = outer()
foo.__closure__

上面的代码会输出一个元组,其中保存了函数inner所在的环境。在这个环境中,x的值是10,因为在调用outer()函数时,x就被定义为10。

__closure__的元素是一个Cell对象,它包含了变量的实际值。这个对象有一个属性叫cell_contents,可以用来查看变量的值。

foo.__closure__[0].cell_contents

上面的代码会输出10,因为cell_contents存储了x的值。

__closure__对于理解一个函数的作用域非常有用。它可以帮助我们更好地理解闭包、装饰器、生成器等高级概念。

如果一个函数没有外层函数,__closure__就为None。如果定义了一个函数f,它没有任何外部变量,则f.__closure__为空。

def f():
  return 42

f.__closure__ is None

上面的代码会输出True,因为f没有任何外部变量。因此,它在执行时不需要访问任何外部环境。