есть ли причина использовать «есть»? - PullRequest
2 голосов
/ 03 апреля 2011

вместо "=="? Я знаю, что "есть", это сравнение идентичности переменной. Но когда ты захочешь это сделать? Все, что он когда-либо делал для меня, является причиной проблем. После некоторого использования (потому что я почувствовал, что мой код стал более читабельным), я не объявляю войну «is».

Кто-нибудь использует это для чего-то, что "==" не будет делать? Я не понимаю, почему они не сделали «это» то же самое, что «==», как они сделали »и« то же самое, что и «&&» и т. Д. Если кто-то хотел указатель, он просто должен сказать «ID (x) == id (y) ", и у нас не было бы этой путаницы.

Это одна из "гочей" в python, которую я не понимаю, и сбивающая с толку многих новичков. Причина, по которой я думаю, что это вводит людей в заблуждение, заключается в том, что они не понимают, почему это могло бы сделать сравнение идентичности. Какой смысл (эр)?

Edit: Спасибо за отличные ответы. Я думаю, что новые люди должны убрать это «всегда использовать» == «, если вы не знаете, что делаете»!

Ответы [ 2 ]

7 голосов
/ 03 апреля 2011

Да, есть причина.

Когда вы хотите сравнить идентификатор объекта ("тот же объект"), а не равенство объекта ("то же значение"). Почти во всех случаях == ( object-равенства ) является правильным оператором для использования. (Как указано в комментариях, тривиальный случай, который я полностью пропустил, - это идиома x is None - None - единственный обитатель NoneType.)

Один случай для идентификатор объекта - это кэш / словарь идентификаторов , который является общим шаблоном в некоторых ситуациях, связанных с прокси или "наизнанку". В этом случае я не хочу возвращать значение для «подобного объекта», я хочу вернуть значение для «того же объекта».

Удачного кодирования.


Думать об указателях в Python неправильно . Значения в Python: объекты , и каждое значение представляет себя. Таким образом, x is y имеет значение true, только когда x и y оценивают один и тот же объект . Когда объекты передаются в python, сохраняется та же самая концепция - передается сам объект . Не нужно думать о ссылках.

Python - это Call-by-Sharing / Call-by-Object-Sharing , хотя термин "Call-By-Reference" - который существует в "местах официальной документации «- часто неправильно используется для описания поведения (возможно, для« облегчения »перехода от других языков, где этот термин также часто неправильно используется).

4 голосов
/ 03 апреля 2011

Существует огромная разница между двумя.is тесты для объекта идентичность и == тесты для равенство .

Рассмотрим простой пример:

print [] == []     # True
print [] is []     # False
...