在 Python 的函数中使用可变类型作为默认参数有什么注意事项吗?

Are there caveats of using mutable types as default parameters in functions in Python?

我最近在 Python 中阅读了有关可变默认参数的内容。 出于某种原因,我想到了这样使用它的想法:

data = [3, 4, 1, 8, 5, 9, 2, 6, 7]


def get_min(checked=[]):
    global data

    mn = min((x for x in data if x not in checked))
    checked.append(mn)

    return mn

该代码非常无用,可以很容易地用生成器替换它,但我想知道我是否应该在我的项目中使用这种技术。做这样的事情有什么隐藏的警告吗?

我读过一些类似的问题,但我看到的都是关于这个东西是设计缺陷的不断争论。所以我想得到一个明确的答案:我应该使用它,还是不应该使用它,为什么?

主要警告是稍后阅读您的代码的人,除非他们熟悉这个特定的陷阱,否则可能不明白 checked 仍然存在,或者调用者实际上并不打算提供它的价值。假设你想避免使用生成器,那么这样写会更清楚:

data = [3, 4, 1, 8, 5, 9, 2, 6, 7]
checked = []

def get_min():
    mn = min(x for x in data if x not in checked)
    checked.append(mn)
    return mn