未检测到不可变(列表元组)内可变的危险默认值

Undetected dangerous default value for mutable inside immutable (tuple of lists)

为什么下面的代码在使用 pylint 时不会为 items 触发 dangerous-default-value?这是pylint意外功能(即错误)吗?

def func(item, items=([],)):
    items[0].append(item)
    return items

我的理解是,这应该是一切手段,因为:

print(func(1))
# ([1],)
print(func(2))
# ([1, 2],)

是否有标准的清理方法,还是我必须自己做?

(注意:这只是 toy 代码来说明问题。)

似乎 pylint 仅针对非嵌套 listdictset 触发 dangerous-default-value,这是一个糟糕的 documented 行为,因为省略了 set 的行为,而以下:

def func(item, items=set()):
    items[0].append(item)
    return items

实际上会触发警告。


用于递归清理(嵌套)listdictset 容器组合的 FlyingCircus package offers a freeze() 函数。

免责声明:我是该软件包的主要作者。