Python闭包如何捕获其包含范围的变量?

2024-04-23 19:24:00 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑以下代码:

def foo():
   print('------- entering foo() ---------')

   def internal():
      print('x in internal: {}'.format(x))
      print('id(x) in internal: {}'.format(id(x)))
      print()

   x = 100
   internal()

   global f
   f = internal

   x = 111
   internal()

   print('------- exiting foo() ---------')
   print()


foo()
f()

代码的输出是:

------- entering foo() ---------
x in internal: 100
id(x) in internal: 4362053072

x in internal: 111
id(x) in internal: 4362053424

------- exiting foo() ---------
x in internal: 111
id(x) in internal: 4362053424

执行foo()的堆栈帧应该在执行完成后销毁吗?但是,根据上面代码的输出,在我看来,f引用的internal的闭包可以访问分配f的执行foo()的堆栈帧。如果堆栈帧已被销毁,f如何访问执行foo()的堆栈帧


Tags: 代码inidformatfoo堆栈defglobal