Почему int (50) - PullRequest
       56

Почему int (50)

6 голосов
/ 24 ноября 2010

В питоне 3 int(50)<'2' вызывает TypeError, и это должно быть. Однако в python 2.x int(50)<'2' возвращает True (это также относится и к другим числовым форматам, но int существует как в py2, так и в py3). Мой вопрос состоит из нескольких частей:

  1. Почему Python 2.x (<3?) Допускает такое поведение? </li>
    • (А кто думал, что начинать это было бы хорошей идеей ???)
  2. Что означает, что int меньше str?
    • Имеется в виду ord / chr?
    • Есть ли какой-нибудь двоичный формат, который менее очевиден?
  3. Есть ли разница между '5' и u'5' в этом отношении?

Ответы [ 4 ]

8 голосов
/ 24 ноября 2010

Работает так: 1 .

>>> float() == long() == int() < dict() < list() < str() < tuple()
True

Числа сравниваются как меньше, чем контейнеры.Числовые типы преобразуются в общий тип и сравниваются на основе их числового значения.Контейнеры сравниваются по буквенному значению их имен. 2

Из документов :

Детали реализации CPython: Объекты различныхтипы кроме номеров упорядочены по> именам типов;объекты тех же типов, которые не поддерживают правильное сравнение,> упорядочены по их адресу.

Объекты различных встроенных типов сравниваются в алфавитном порядке по имени их типа int начинается с'i' и str начинаются с s, поэтому любое int меньше, чем любое str. .

  1. Понятия не имею.
    • Пьяный мастер.
  2. Это означает, что для встроенных типов введен формальный порядок.
    • Это относится к произвольному порядку.
    • Нет.
  3. Нет.Строки и объекты Unicode считаются одинаковыми для этой цели.Попробуйте.

В ответ на комментарий о long < int

>>> int < long
True

Вы, вероятно, имели в виду значения этих типов, и в этом случае применяется числовое сравнение.

1 Это все на Python 2.6.5

2 Спасибо kRON за разъяснение этого вопроса для меня.Я никогда не думал сравнивать число с dict раньше, и сравнение чисел - это одна из тех вещей, которые настолько очевидны, что их легко не заметить.

6 голосов
/ 24 ноября 2010

Причиной, по которой эти сравнения разрешены, является сортировка.Python 2.x может сортировать списки, содержащие смешанные типы, включая строки и целые числа - целые числа всегда появляются первыми.Python 3.x не позволяет этого по указанным вами точным причинам.

Python 2.x:

>>> sorted([1, '1'])
[1, '1']
>>> sorted([1, '1', 2, '2'])
[1, 2, '1', '2']

Python 3.x:

>>> sorted([1, '1'])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: str() < int()
1 голос
/ 24 ноября 2010

Как сказал Аарон.Разбив его на ваши пункты:

  1. Поскольку сортировка делает что-то наполовину пригодным для использования, в противном случае она вообще не имела бы смысла (смешанные списки).Обычно это не очень хорошая идея, но многое в Python разработано для удобства, а не для строгости.
  2. Упорядочено по имени типа.Это означает, что вещи одной группы типов вместе, где они могут быть отсортированы.Вероятно, они должны быть сгруппированы по классам типов, таким как числа вместе, но нет подходящей структуры класса типов.Там может быть несколько более конкретных правил (вероятно, это правило для числовых типов), мне нужно проверить источник.
  3. Одно - строка, а другое - юникод.Однако у них может быть операция прямого сравнения, но вполне возможно, что несопоставимый тип будет сгруппирован между ними, что приведет к путанице.Я не знаю, есть ли код, чтобы этого избежать.

Так что в общем случае это не имеет смысла, но иногда это полезно.

from random import shuffle
letters=list('abcdefgh')
ints=range(8)
both=ints+letters
shuffle(ints)
shuffle(letters)
shuffle(both)
print sorted(ints+letters)
print sorted(both)

Обе печатисначала целые, затем буквы.

Как правило, вы не хотите смешивать типы случайным образом внутри программы, и, очевидно, Python 3 предотвращает это, когда Python 2 пытается сделать смутный смысл там, где его нет.Вы все еще можете отсортировать по lambda a,b: cmp(repr(a),repr(b)) (или что-то лучше), если действительно хотите, но, похоже, разработчики языка согласились, что это непрактичное поведение по умолчанию.Я ожидаю, что это варьируется, что вызывает наименьшее удивление, но намного сложнее обнаружить проблему в смысле Python 2.

1 голос
/ 24 ноября 2010

(А кто подумал, что начинать это было бы хорошей идеей ???)

Я могу себе представить, что причина может заключаться в том, чтобы позволить объектам разных типов храниться в древовидных структурах, которые используют сравнения внутри.

...