Python 内置 max/min 函数的默认键
Python内置的max
和min
函数的说明书上说,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)
没有出现错误,并且使用了默认的排序方式。很多书也暗示我应该能在max
和min
函数中得到同样的效果。比如这本书的摘录:Python in a Nutshell.
那么,max
和min
函数的默认行为真的是这样吗?应该是这样吗?难道它们不应该和sort
函数一致吗?
2 个回答
8
@David的回答非常好。我再补充一下,如果你在想,默认的 key
值(在 sort
和 max
/min
函数中)大概是这样的:
lambda x: x
24
你发现了一个关于 .sort
和 max
的实现差异,这其实不是语言本身的问题。
list.sort()
方法有一个叫做 "key" 的参数,默认值是 None。这意味着当你传入 key=None
时,排序方法无法判断你是故意传了这个参数,还是它只是用了默认值。在这两种情况下,它的表现都像是没有提供任何关键函数。
而 max
方法则会检查 "key" 参数是否存在。它没有默认值,如果你提供了这个参数,它的值就会被用作关键函数。
无论如何,"key" 参数不应该被设置为 None。它应该是一个函数,用来从列表或可迭代对象中的项目提取出一个 "key" 值。例如:
a = [("one", 1), ("two", 2), ("three", 3), ("four", 4)]
a.sort(key=lambda item:item[1])