关于以下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
相关产品推荐
相关产品推荐

