You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于以下Python闭包代码的理解是否正确?

闭包行为理解验证

示例代码

def outer(l):
    def inner(n):
        return l * n
    return inner

l = [1, 2, 3]
f = outer(l)
print(f(3))  # => [1, 2, 3, 1, 2, 3, 1, 2, 3]
l.append(4)
print(f(3))  # => [1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4]

理解修正与说明

你对两次调用f(3)的输出结果判断是正确的,但关于闭包引用l的来源描述有误:

  • 当调用outer(l)时,全局变量l指向的列表对象[1,2,3]被传入outer,此时outer的局部参数l也指向这个对象。闭包inner(即绑定后的f)捕获的是**outer函数作用域内的局部变量l**,而非全局命名空间中的l。
  • 后续修改全局l指向的对象会影响f的执行结果,是因为全局l和outer的局部l指向的是同一个可变列表对象。执行l.append(4)时,修改的是这个对象本身,而非改变变量的指向,所以闭包引用的l(仍指向该对象)自然能看到修改后的内容。

如果调整代码,就能更清晰区分作用域差异:

def outer(l):
    def inner(n):
        return l * n
    return inner

l = [1, 2, 3]
f = outer(l)
print(f(3))  # => [1,2,3,1,2,3,1,2,3]
# 给全局l赋值新列表
l = [4,5,6]
print(f(3))  # 仍输出 [1,2,3,1,2,3,1,2,3],因为闭包捕获的是outer作用域的l,它还指向原列表

总结

你对执行结果的判断正确,但闭包引用的l来自outer的局部作用域,而非全局命名空间。闭包会保留对其定义时所在作用域变量的引用,而非直接关联全局变量。

内容的提问来源于stack exchange,提问作者Happy Yoon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 00:40:28