Python 2.x возвращает значения для cmp
Цитата из docs:
cmp(x, y)
Сравните два объекта x и y и верните целое число в соответствии с результатом. Возвращаемое значение отрицательно, если x < y
, ноль, если x == y
и строго положительное, если x > y
.
Я был в предположении, что возвращаемые значения всегда -1
, 0
и 1
, но документы явно не говорят, что упоминание только нулевого и положительного/отрицательного возвращаемого значения.
Есть ли ситуации, когда возвращаемое значение cmp(x,y)
не -1
, 0
или 1
?
Ответы
Ответ 1
Нет, документы явно говорят, что yalues может быть чем угодно. Единственное значение, которое указано, равно 0
, если сравниваемые объекты равны. Не доверяйте факту, что вы видите только значения -1
, 0
и 1
, что деталь реализации и может изменить *, поэтому всегда проверяйте <
и >
0.
*: note - на самом деле это не будет иметь шанса на изменение, так как cmp
ушел в pyhton3. используйте богатое сравнение.
Ответ 2
Можно полагаться только на 0, хотя интересна для docstring для list.sort
:
print list.sort.__doc__
L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;
cmp(x, y) -> -1, 0, 1
Но на самом деле сортировка на самом деле не накладывает это на эту функцию сравнения, как можно увидеть здесь:
def mycmp(a, b):
print "mycmp(): a - b = ", a - b
return a - b
L = [50, 30, 20, 40, 70, 50]
>>> L.sort(cmp=mycmp)
mycmp(): a - b = -20
mycmp(): a - b = -10
mycmp(): a - b = 20
mycmp(): a - b = 10
mycmp(): a - b = -10
mycmp(): a - b = 30
mycmp(): a - b = 20
mycmp(): a - b = 10
mycmp(): a - b = -20
mycmp(): a - b = 0
>>> print L
[20, 30, 40, 50, 50, 70]
Просто для интереса, но ясно, что sort
работает счастливо со значениями, отличными от -1
, 0
или +1
, поэтому вы тоже должны быть!