Python нет сравнения: должен ли я использовать "is" или ==?
Возможный дубликат:
когда оператор '= = 'не эквивалентен оператору 'is'? (Python)
Я использую Python 2.x.
Мой редактор дает мне "предупреждение" подчеркивание, когда я сравниваю my_var == None, но никакого предупреждения, когда я использую my_var is None.
my_var is None предпочтительнее.
Так ли это, и если да, то почему?3 ответа:
Резюме:
Используйте
is, Когда вы хотите проверить идентичность объекта (например, проверить, является лиvarNone). Используйте==, Когда вы хотите проверитьравенство (например, равен лиvar3?).Пояснение:
У вас могут быть пользовательские классы, где
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, никогда не операторы равенства."