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

时间:2019-03-21 05:03:19

标签: python python-3.x closures

考虑以下代码:

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()执行的堆栈框架应该被销毁吗?但是,根据上面代码的输出,在我看来,internal引用的f的闭包可以访问分配了{{1 }}。如果栈帧已被破坏,foo()如何访问执行f的栈帧?

0 个答案:

没有答案