Почему Python не рассматривает два отдельных экземпляра модели Django как один и тот же объект? - PullRequest
1 голос
/ 12 ноября 2011

(используя в качестве примера django; в примере неявно используется ForeignKey)

>>> from coconuts.models import Coconut, Swallow
>>> c1 = Coconut.objects.get(id=1)
>>> s = Swallow.objects.get(id=1)
>>> c2 = s.coconuts_carried.filter(id=1)
>>> c1 == c2
True
>>> c1 is c2
False

Насколько я понимаю, «is» проверяет идентичность, а == проверяет равенство. В этом случае c1 и c2 - это один и тот же точный объект. Почему "не" они одно и то же?

Ответы [ 3 ]

4 голосов
/ 12 ноября 2011

is сравнивает объекты Python, а не объекты в вашей базе данных.каждый запрос возвращает новые объекты Python, и поэтому c и c2 различны.

, чтобы увидеть это, попробуйте изменить некоторые свойства c или c2.Изменится только один из них.

, как видно из документы ,

c == c2

эквивалентны

c.id == c2.id
1 голос
/ 12 ноября 2011

Это те же объекты, если вы говорите о «объектах базы данных», но не о «объектах Python».

a is b будет True, если a и b - это один и тот же экземпляр объекта Python - они имеют одинаковую идентичность.Оператор is не может быть перегружен, поэтому он работает одинаково со всеми объектами Python.

Чтобы понять, что здесь происходит, отметьте id(c1) и id(c2) в интерактивной оболочке Python.Вы заметите, что у них разные идентичности.

a == b будет True, если a и b считаются равными.Оператор == может быть перегружен, поэтому разные объекты ведут себя по-разному при сравнении. При сравнении объектов модели Django они считаются равными, когда они одного типа, а их первичные ключи равны.

0 голосов
/ 12 ноября 2011

Если мы пиратим игру с одного и того же веб-сайта и записываем ее на компакт-диск, мой компакт-диск не совпадает с вашим компакт-диском, даже если его содержимое идентично и происходит из одного источника.Вот.При доступе к базе данных каждый раз создается еще один объект Python с теми же данными.

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