Почему функция Max () Python помещает низкое значение в строки с начальным пробелом?
Вопрос
Я заметил, что встроенная функция max()
в Python 2.7.6, похоже, помещает низкое "значение" в строки с начальным пробелом, если я специально не скажу ей использовать функцию len
в качестве ключа. Почему это так?
Пример
Рассмотрим этот фрагмент из интерактивного интерпретатора:> > > макс (['abc', 'defgh'])
'defgh'
> > > Макс (['abc', 'defgh'])
'abc'
> > > Макс (['defgh'])
'defgh'
>>> max (['abc', 'defgh'], key=len)
'defgh'
Примечания
Я попытался посмотреть на Источник Для max()
, и он вызывает min_max(). В строке 1370 обрабатывается случай, когда ключ не указан. Есть комментарий, который говорит: "нет ключевой функции; значение-это элемент". Я не знаю, какое значение может быть связано со строкой помимо длины, так что же означает этот комментарий? Кроме того, почему ведущее пространство влияет на магическую ценность этого кода C это ключ от него?
2 ответа:
Python вообще не "игнорирует" строку - поведение именно потому, что Pythonне игнорирует что-либо.
Скорее пробел предшествует буквы и строки упорядочены лексикографически(чувствительно к регистру!) или от персонажа к персонажу. Смотрите таблицуASCII для относительного порядка пробела (пробел=32) и других символов в английском алфавите ("a"=97).
То есть
" foo" < "foo"
истинно,min(" foo", "foo")
Есть" foo"
и, наоборот,max(" foo", "foo")
есть"foo"
. Следовательно, это также приводит к тому, что"Z" < "a"
истинно, что может быть удивительно..Если код хотел игнорировать пространство, то
max(.., key = lambda i: i.strip())
можно было бы использовать, возможно, также с соответствующей нормализацией регистра.(результаты добавления функции длины ключа в данном случае не имеют значения, так как большая длина равна max'ER.)