666999666999 发表于 2025-8-1 16:12:22

闭包函数对嵌套函数引用的问题

def fun():
    x = 880
    def funny():
      print(x)
    return funny

fun()
<function fun.<locals>.funny at 0x0000023779332200>
fun()
<function fun.<locals>.funny at 0x0000023779332520>
fun()
<function fun.<locals>.funny at 0x00000237793325C0>
fun()
<function fun.<locals>.funny at 0x00000237793323E0>
fun()
<function fun.<locals>.funny at 0x0000023779332340>
fun()
<function fun.<locals>.funny at 0x0000023779332200>
fun()
<function fun.<locals>.funny at 0x00000237793323E0>
课程上说此时调用fun()是对funny()函数的引用,为什么每一次调用fun()返回的引用都不一样啊,求解惑

FishC 发表于 2025-8-1 16:13:15

在Python中,每次调用外部函数 fun() 时,都会创建一个新的内部函数实例,即使它们的代码完全相同。这是因为:

1. 每次调用 fun() 时:
   - 都会创建新的局部变量 x = 880
   - 都会重新定义一个全新的 funny 函数
   - 返回的是新创建的 funny 函数对象

2. 验证差异(用id查看内存地址):

f1 = fun()
f2 = fun()
print(id(f1))# 输出示例:140123456
print(id(f2))# 输出示例:140789012 → 地址不同
print(f1 is f2)# 输出 False → 不是同一个对象


3. 闭包本质:
每个返回的 funny 都是独立的闭包,它们各自"记住"的是不同时刻创建的变量 x(虽然值相同,但存储位置不同)

4. 执行效果相同的原因:
虽然函数对象不同,但执行结果相同,因为它们都绑定了值为880的变量:

f1()# 输出880
f2()# 输出880 → 结果相同但函数对象不同


总结:每次调用外部函数都会生成全新的闭包函数对象,这是Python函数的正常行为。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

某一个“天” 发表于 2025-8-1 17:21:37

每次调用外部函数都会生成全新的闭包函数对象

某一个“天” 发表于 2025-8-1 17:25:30

其实更本质的原因是你使用了交互式,每次都重新运行了

以下是你要的效果,输出全一样
def fun():
    x = 880
    def funny():
      print(x)
    return funny
for i in range(100):
    print(fun())

页: [1]
查看完整版本: 闭包函数对嵌套函数引用的问题