首页 > 试题广场 >

以下Python代码的输出结果是什么? def outer(

[单选题]
以下Python代码的输出结果是什么?
def outer():
    funcs = []
    for i in range(3):
        def inner():
            return i
        funcs.append(inner)
    return funcs
for f in outer():
    print(f(), end=" ")
  • 0 1 2
  • 2 2 2
  • 0 0 0
  • 1 1 1
这是一个经典的 Python 闭包(closure)延迟绑定问题。
为什么不是012:
关键在于:inner函数并没有在定义时捕获i的值,而是捕获了变量i的引用。当 inner 被调用时,它会去查找当前作用域中 i 的值。由于 inner 是在循环结束后才被调用的(在 for f in outer(): print(f(), end=" ") 中),此时循环已经结束,i 的最终值是 2,所以每个 inner() 返回的都是 2

如果想得到012,需要在定义 inner强制绑定当前的i值:
def outer(): 
    funcs = [] 
    for i in range(3): 
         def inner(i=i): # 关键:用默认参数绑定当前 i 的值 
             return i 
         funcs.append(inner) 
     return funcs 
for f in outer(): 
     print(f(), end=" ")

发表于 2025-09-09 10:50:00 回复(0)

Python 的闭包(closure)捕获的是变量 i 本身,而不是循环中每个 i 的当前值。
循环过程中,i 依次为 0, 1, 2,但是每次创建的 inner 函数都引用同一个变量 i

当循环结束时,i 的值是 2。
因此,在 outer() 执行完毕后返回的三个 inner 函数,它们的闭包中引用的 i 都是循环结束后最终的 i 值

发表于 2026-01-27 18:40:39 回复(0)