Мой редактор предупреждает меня, когда я сравниваю my_var == None
, но не предупреждает, когда я использую my_var is None
.
Я провел тест в оболочке Python и определил, что оба кода являются допустимыми, но мой редактор, кажется, говорит, что my_var is None
это предпочтительнее.
Так ли это, и если да, то почему?
python
comparison
nonetype
Клэй Уорделл
источник
источник
is
- python.org/dev/peps/pep-0008/#programming-recommendationsОтветы:
Резюме:
Используйте,
is
когда вы хотите проверить идентичность объекта (например, проверить, еслиvar
естьNone
). Используйте,==
когда вы хотите проверить равенство (например,var
равно3
?).Объяснение:
Вы можете иметь пользовательские классы, где
my_var == None
будут возвращатьсяTrue
например:
is
проверяет идентичность объекта . Существует только 1 объектNone
, поэтому, когда вы это делаетеmy_var is None
, вы проверяете, являются ли они на самом деле одним и тем же объектом (а не просто эквивалентными объектами)Другими словами,
==
это проверка на эквивалентность (которая определяется от объекта к объекту), тогда какis
проверка на идентичность объекта:источник
is None
отличается от== None
?__eq__
может быть определена любым способом, но поведениеis
не может быть так легко изменено.is
». После комментария к спискам он изменил это на «… дажеis
(но только если вы ненормальный)».object == None
самом деле это правильная идиома (хотя я не могу думать ни о чем из головы). Вам просто нужно знать, что вы делаете.is
Обычно предпочтительнее сравнивать произвольные объекты с синглетами, например,None
потому что это быстрее и более предсказуемо.is
всегда сравнивается по идентичности объекта, тогда как то, что==
будет делать, зависит от точного типа операндов и даже от их порядка.Эта рекомендация поддерживается в PEP 8 , в которой прямо говорится, что «сравнение с синглетами, такими как None, всегда должно выполняться с использованием операторов равенства,
is
илиis not
никогда с ними».источник
None
под глобальной константой есть только один объектNone
. Во всяком случае,NoneType
это деталь реализации, потому чтоNone
синглтон должен иметь некоторый тип. (Тот факт, что вы не можете создавать экземпляры этого типа, является хорошим свидетельством того, что один его экземпляр предназначен для использования в качествеNone
, все средства использоватьobj == None
. Если вы хотите проверить , является ли объект являетсяNone
использоватьobj is None
. Суть рекомендации PEP 8 (и этого ответа) заключается в том, что большинство людей хотят последнее, когда хотят проверить None, и это также оказывается быстрее и понятнее.None
также отличается от кэшируемых объектов, таких как0
и другие маленькие целые числа, где кэширование действительно является деталью реализации. Разница в том, что целое число имеет внутреннее значение, которое дает его свойства, и его можно вычислить. С другой стороны,None
не имеет государства вообще, имеет значение только его личность и делает его особенным.PEP 8 определяет, что лучше использовать
is
оператор при сравнении синглетонов.источник