heapq
просто сравнивает значения из очереди, используя оператор «меньше чем» [1] независимо от типа значения. Это тип значения, которое определяет, что будет возвращать сравнение. Таким образом, дерьмо имеет значение здесь сам кортеж. Начиная с документации :
Для сравнения [объектов последовательности] используется лексикографическое упорядочение: сначала сравниваются первые два элемента, и если они отличаются, определяет результат сравнения; если они равны, сравниваются следующие два элемента и т. д., пока не будет исчерпана любая последовательность.
Проверка некоторых примеров:
>>> (0, 'a') < (1, 'aa')
True
>>> (1, 'a') < (1, 'aa')
True
>>> (1, 'aa') < (1, 'a')
False
>>> (2, 'a') < (1, 'aa')
False
Итак, вы правы, значения упорядочены лексикографически, и второе значение кортежа является релевантным. Однако heapq
здесь не нужно ничего делать, чтобы получить этот результат, это делает простое сравнение кортежей.
[1] Это можно проверить в коде. Здесь - это одна из строк, где сравнение выполняется на heapq
(в C):
cmp = PyObject_RichCompareBool(newitem, parent, Py_LT);
Это PyObject_RichCompareBool()
, согласно документации :
эквивалент Python выражения o1 op o2, где op - оператор, соответствующий opid .