is
тесты на идентичность, не равенство. Для вашего утверждения foo is none
Python просто сравнивает адрес памяти объектов. Это означает, что вы задаете вопрос «У меня есть два имени для одного и того же объекта?»
==
, с другой стороны, проверяет равенство, определенное методом __eq__()
. Это не заботится о личности.
In [102]: x, y, z = 2, 2, 2.0
In [103]: id(x), id(y), id(z)
Out[103]: (38641984, 38641984, 48420880)
In [104]: x is y
Out[104]: True
In [105]: x == y
Out[105]: True
In [106]: x is z
Out[106]: False
In [107]: x == z
Out[107]: True
None
- оператор-одиночка. Так что None is None
всегда верно.
In [101]: None is None
Out[101]: True