if obj == None, используйте if obj is NoneВ Python, когда вы пишете:
obj == None
вы не проверяете напрямую, является ли
obj значением None. Вместо этого вы спрашиваете, равен ли объект None.Да, во многих случаях результат будет таким же, как у кода:
obj is None
Но поведение у этих двух вариантов разное, и эта разница важна.
Когда вы используете:
obj == None
Python вызывает метод
__eq__ у объекта. То есть сам объект решает, что значит "равен None". А этот метод можно переопределить.Если
obj это экземпляр класса, в котором __eq__ реализован так, что при сравнении с None возвращается True (даже если объект на самом деле не None), тогда obj == None может ошибочно дать True.Пример:
class Weird:
def __eq__(self, other):
return True # Всегда утверждает, что равен
obj = Weird()
print(obj == None) # True
print(obj is None) # False
Здесь видно, что
obj == None возвращает True из-за кастомного поведения оператора __eq__ в классе.Из этого следует, что при использовании
obj == None результат не всегда предсказуем.С другой стороны, когда вы пишете:
obj is None
вы используете оператор
is, который нельзя переопределить. Это значит, что результат всегда будет одинаковым и предсказуемым.Оператор
is проверяет идентичность объектов, то есть указывают ли две ссылки на один и тот же объект. Поскольку None это singleton (единственный экземпляр), obj is None это правильный и самый эффективный способ такой проверки.❤️ Поэтому всегда рекомендуется, и это best practice, использовать
obj is None вместо obj == None ради предсказуемости и эффективности.👉 @PythonPortal
