繁体   English   中英

不了解python中的闭包问题

[英]do not understand closures question in python

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

print a()
print a()

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

谢谢您的帮助

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

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

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

由于其他答案中给出的原因,更正后的版本是:

def a(b=None):
    b = [] if b is None else b

    b.append(1)
    return b

定义函数时,不会在每次调用函数时评估(一次)默认参数。

试试这个:

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

print a()
print a()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM