为何返回内部函数的包装器每次返回的都是该内部函数的不同副本?
为什么f和f2是不同的函数对象?
首先看对应的代码示例:
def outer(): def inner(a): return a return inner f = outer() print(f) # <function outer.<locals>.inner at 0x1044b61e0> f2 = outer() print(f2) # <function outer.<locals>.inner at 0x1044b6268> (Different from above)
二者存在差异的技术解释如下:
- 每次调用
outer()时,Python会进入一个全新的执行上下文,在这个上下文的局部作用域中重新创建inner函数对象。 - 函数在Python里是一等对象,嵌套函数的定义过程会在每次外层函数调用时触发新的对象实例化:第一次调用
outer()生成的inner实例被赋值给f,第二次调用outer()会生成另一个完全独立的inner实例,它拥有不同的内存地址,最终赋值给f2。 - 尽管两个
inner的代码逻辑完全相同,但它们是内存中两个独立的对象,因此f和f2指向的是不同的实体。
内容的提问来源于stack exchange,提问作者Happy Yoon
相关产品推荐
相关产品推荐

