Pull to refresh

Comments 15

У Вас написано довольно много ереси и глупостей:
1. Любые данные в Python это об<ъекты.
2. Если объекты «одинаковы», то они хранятся по одному адресу в памяти. Иными словами, a == b и id(a) == id(b) это эквивалентные утверждения.

>>> a = [1, 2, 3]
>>> b = [1, 2, 3]
>>> a == b
True
>>> id(a) == id(b)
False

Касательно именно чисел Вам надо почитать, что такое free list.
Статья — бред.
Если тема действительно интересна, начать копать нужно, как минимум, с изучения исходников питона, но если это слишком сложно, то можно просто погуглить. Вот первая достаточно интересная ссылка по теме: stackoverflow.com/questions/132988/is-there-a-difference-between-and-is-in-python
А почему надо смотреть исходники? У каждого промышленного ЯП есть стандарт где все описывается а уж компилятор или компиляторы его реализую. Так что надо не исходникам лазить, а доки читать.
Под катом — статья про то как в Python реализовано хранение данных в памяти

И простыня полного бреда со «срывом покровов» и «сенсационными заявлениями» вида:
Более сложной оптимизации не используется

Причём все это «методом тыка», умозрительные (и неверные!) заключения вообще ни о чём.

В питоне со стандартами не всё так хорошо. К тому же наш автор пишет (сам того не осознавая) о CPython, а не о питоне. А CPython, как любой компилятор/интерпретатор использует кучу хаков (например, кэширование integers) и это нормально, только вот я сомневаюсь, что в стандартах языка такие вещи вообще целесообразно описывать. Один компилятор/интерпретатор делает так, другой — иначе.
Иными словами, a == b и id(a) == id(b) это эквивалентные утверждения.

Из id(a) == id(b) следует a == b, обратное не верно
Нет. Вы можете переопределить __eq__ любым угодным вам способом. Другой вопрос, что в ряде мест (к примеру, при сравнении списков) применяется сравнение id() перед сравнением объектов: есть известный пример с NaN, или вот ещё:

Python 2.7.8 (a980ebb26592ed26706cd33a4e05eb45b5d3ea09, Nov 28 2014, 06:20:07)
[PyPy 2.4.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>> class NE(object):
....    def __eq__(self, other):
....            return False
....
>>>> n = NE()
>>>> [1, 2, n] == [1, 2, n]
True
>>>> n == n
False


. В CPython и jython картина точно такая же. IronPython покажет два False, но у него всегда были проблемы с совместимостью.
Это неверно хотя бы потому что
>>> a = 0.0
>>> b = 0
>>> a == b
True
>>> id(a)
4320174608
>>> id(b)
4297546528

Что неверно? Я не говорил, что == сравнивает id. Я говорил, что он сравнивает id при сравнении списков, перед тем, как использовать «честный» ==.

Почему не удаляют статью такого низкого качества, это очень коварно.
Sign up to leave a comment.

Articles