Python内置的max/min函数的默认键

8
Python内置函数 maxmin 的文档表明,key 参数应该像 sort 函数中一样操作。换句话说,我可以这样做:
a = [1, 2, 3, 4]
max(a, key=None)

然而,这会引发一个错误:TypeError: 'NoneType' object is not callable 但是,如果我用sort函数做类似的操作,我会得到预期结果。
a = [1, 2, 3, 4]
a.sort(key=None)

没有错误产生,并且使用默认排序。几本书还暗示我应该能够在maxmin函数中得到相同的行为。请参考Python in a Nutshell中的摘录。
这真的是maxmin函数的默认行为吗?它应该吗?难道它们不应该与排序函数匹配吗?

在3.8中无法重现;max([1, 2, 3, 4], key=None)返回4。我不确定这个更改是何时发生的。 - Karl Knechtel
2个回答

24
您遇到了.sort和.max的实现差异问题,而不仅仅是语言问题。 list.sort()可以接收一个关键字参数"key",默认为None。这意味着sort方法无法区分您是否提供了key=None参数或者只是采用了默认值。在任一情况下,它都会表现得好像没有提供key函数一样。
而另一方面,max则检查关键字参数"key"是否存在。它没有默认值,如果传入了,则作为key函数的值使用。
总之,key绝不能被设置为None。它应该是一个函数,用于从列表/可迭代对象中提取"key"值。例如:
a = [("one", 1), ("two", 2), ("three", 3), ("four", 4)]
a.sort(key=lambda item:item[1])

谢谢您的回复。我知道这些功能的实际实现是不同的,但我有点沮丧的是,我能找到的所有文档都没有明确说明这种差异。 - Chris Mansley
没问题。如果这回答了你的问题,接受它总是受欢迎的。 - David K. Hess

8

@David的回答非常完美。仅附加一点,如果你想知道,默认的key值(在sortmax/min函数中)类似于:

lambda x: x

1
但是,sort处理将None作为默认值传递的情况,而min/max则不会。因此,某些内容正在以不同的方式实现。如果您查看代码,min和max函数只需检查是否已在参数字典中定义该值。我不认为max/min键参数有默认值,只有默认行为。 - Chris Mansley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接