Почему функция 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 2

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.)

Max не использует длину, он использует алфавитный порядок:

>>> max(['abc', 'de'])
'de'

Пространство предшествует "а":

>>> ' ' < 'a'
True