在 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
我最近在 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