不了解python中的闭包问题

one*_*lf1 5 python closures parameter-passing

def a(b=[]):
    b.append(1)
    return b

print a()
print a()
Run Code Online (Sandbox Code Playgroud)

我突然得到了一张2元的名单,但是如何?不应该每次都被设置为空列表.

谢谢您的帮助

Ign*_*ams 10

定义函数时,默认参数仅计算一次.它从一次调用到下一次调用保留相同的对象,这意味着相同的列表会被追加到.None如果你想解决这个问题,请使用默认值并检查它.


Kar*_*tel 9

与闭合无关,至少不是通常意义上的闭合.

默认值b不是"新的空列表"; 它是"我在创建函数时刚刚创建的这个特定对象,将其初始化为空列表".每次在没有参数的情况下调用函数时,都会使用相同的对象.