Python: сравнение по умолчанию - PullRequest
9 голосов
/ 06 июня 2011

В Python 2.7 я определяю пустой класс нового стиля:

In [43]: class C(object): pass
   ....:

, затем создаю список экземпляров нового класса:

In [44]: c = [C() for i in xrange(10)]

, затем пытаюсь отсортироватьlist:

In [45]: sorted(c)
Out[45]:
[<__main__.C object at 0x1950a490>,
 <__main__.C object at 0x1950a4d0>,
 ...
 <__main__.C object at 0x1950aad0>]

Что удивительно, так это то, что сортировка не вызывает жалоб, хотя я не определил способ сравнения экземпляров C:

In [46]: dir(C())
Out[46]:
['__class__',
 '__delattr__',
 '__dict__',
 '__doc__',
 '__format__',
 '__getattribute__',
 '__hash__',
 '__init__',
 '__module__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__']

Что именночто там происходит, и в чем причина этого - возможно, удивительного - поведения?

Ответы [ 3 ]

15 голосов
/ 06 июня 2011

Я думаю, что единственное обоснование заключается в том, что удобно сортировать объекты и, например, используется в качестве словарных ключей с некоторым поведением по умолчанию. Соответствующая глава в определении языка находится здесь: https://docs.python.org/2/reference/expressions.html#not-in

«Выбор, считать ли один объект меньшим или большим, чем другой, сделан произвольно, но последовательно в рамках одного выполнения программы.»

Таким образом, тот факт, что объекты в настоящее время сравниваются с использованием адреса памяти, - это просто деталь реализации, на которую нельзя рассчитывать. Единственная гарантия состоит в том, что порядок остается неизменным во время исполнения.

1 голос
/ 06 июня 2011

Я не совсем уверен, но, возможно, кто-то может поправить меня в этом.

Когда вы сравниваете объекты, он сравнивает их адрес в памяти, подумайте о сравнении двух строк в C. Если вы посмотрите, сортировка отсортировала объекты по младшему адресу памяти по наибольшему адресу памяти (или адресу указателя).

0 голосов
/ 06 июня 2011

Посмотрите значения при печати. Обратите внимание на шестнадцатеричное число рядом с «Объектом C в»? Это ссылка на указатель. Это может быть примерно приравнено к порядку создания. Если вы перебираете этот список, вы увидите, что он отсортировал объекты, используя его в качестве стандарта.

В качестве примечания я помню, что был озадачен сравнениями Python 2.x ... но я не знаю, было ли это, в частности, исправлено в Py3k.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...