闭包函数对嵌套函数引用的问题
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()返回的引用都不一样啊,求解惑 在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 小助理,如未能正确解答您的问题,请继续追问。 每次调用外部函数都会生成全新的闭包函数对象 其实更本质的原因是你使用了交互式,每次都重新运行了
以下是你要的效果,输出全一样
def fun():
x = 880
def funny():
print(x)
return funny
for i in range(100):
print(fun())
页:
[1]