Python нет сравнения: должен ли я использовать "is" или ==?
Возможный дубликат:
когда оператор '= = 'не эквивалентен оператору 'is'? (Python)
Я использую Python 2.x.
Мой редактор дает мне "предупреждение" подчеркивание, когда я сравниваю my_var == None
, но никакого предупреждения, когда я использую my_var is None
.
my_var is None
предпочтительнее.
Так ли это, и если да, то почему?3 ответа:
Резюме:
Используйте
is
, Когда вы хотите проверить идентичность объекта (например, проверить, является лиvar
None
). Используйте==
, Когда вы хотите проверитьравенство (например, равен лиvar
3
?).Пояснение:
У вас могут быть пользовательские классы, где
my_var == None
вернетTrue
Например:
class Negator(object): def __eq__(self,other): return not other thing = Negator() print thing == None #True print thing is None #False
Другими словами,
is
проверяет идентичность объекта . Существует только 1 ОбъектNone
, поэтому, когда вы делаетеmy_var is None
, вы проверяете, являются ли они фактически являются одним и тем же объектом (а не просто эквивалентными объектами)==
является проверкой эквивалентности (которая определяется от объекта к объекту), тогда какis
проверяет идентичность объекта:lst = [1,2,3] lst == lst[:] # This is True since the lists are "equivalent" lst is lst[:] # This is False since they're actually different objects
is
обычно предпочтительнее при сравнении произвольных объектов с синглетами, такими какNone
, потому что это быстрее и более предсказуемо.is
всегда сравнивает по тождеству объектов, тогда как то, что будет делать==
, зависит от точного типа операндов и даже от их порядка.Эта рекомендация поддерживаетсяPEP 8 , которыйявно заявляет , что "сравнения с синглетонами, такими как None, всегда должны выполняться с
is
илиis not
, никогда не операторы равенства."