Операция сравнения по умолчанию в cpython 2 основана на адресе памяти рассматриваемого объекта. От type_richcompare()
в Python 2.7:
/* Compare addresses */
vv = (Py_uintptr_t)v;
ww = (Py_uintptr_t)w;
switch (op) {
case Py_LT: c = vv < ww; break;
case Py_LE: c = vv <= ww; break;
case Py_EQ: c = vv == ww; break;
case Py_NE: c = vv != ww; break;
case Py_GT: c = vv > ww; break;
case Py_GE: c = vv >= ww; break;
default:
result = Py_NotImplemented;
goto out;
}
result = c ? Py_True : Py_False;
Это действительно хорошо работает для равенства и неравенства, но может быть нелогичным для операций упорядочения, поэтому оно было изменено для Python 3. Действительно, 2.7 выдаст предупреждение для таких случаев использования, когда указан флаг -3
.
Чтобы увидеть адрес памяти данного объекта, вы можете использовать встроенную функцию id()
. Определено, что он возвращает что-то уникальное для каждого отдельного объекта, но cpython использует адрес памяти объекта в качестве удобного ярлыка.
У маленьких целых чисел адреса памяти меньше, чем у коротких строк, по крайней мере, в некоторых версиях Python, возможно, из-за кэширования, используемого cpython для повышения производительности.