Класс волен реализовать сравнение любым способом, который он выберет, и он может сделать так, чтобы сравнение с None что-то значило (что на самом деле имеет смысл; если кто-то сказал вам реализовать объект None с нуля, как еще вы могли бы заставить его сравнивать True с самим собой?).
С практической точки зрения, особой разницы нет, поскольку пользовательские операторы сравнения встречаются редко. Но вы должны использовать is None как общее правило.
В данном случае они одинаковы. None это одноэлементный объект (когда-либо существовал только один None).
is проверяет, является ли объект одним и тем же объектом, в то время как == просто проверяет, эквивалентны ли они.
Например:
p = [1] q = [1] p is q # False because they are not the same actual object p == q # True because they are equivalent
Но поскольку существует только один None, они всегда будут одинаковыми и is вернут True .
p = None q = None p is q # True because they are both pointing to the same "None"
Ответ 4
Это зависит от того, что вы сравниваете с None. У некоторых классов есть пользовательские методы сравнения, которые обрабатывают == None иначе, чем is None.
В частности, вывод a == Noneдаже не обязательно должен быть логическим !! - частая причина ошибок.
Для конкретного примера возьмем массив numpy, где == сравнение реализовано поэлементно:
import numpy as np a = np.zeros(3) # now a is array([0., 0., 0.]) a == None#compares elementwise, outputs array([False, False, False]), i.e. not boolean!!! a isNone#compares object to object, outputs False