is проверяет идентичность, т.е. ссылаются ли два выражения на один и тот же объект.
== проверяет эквивалентность, т.е. равны ли два объекта по содержанию.
При этом == поддаётся переопределению, что позволяет разным объектам по-своему определять понятие равенства. is переопределять нельзя.
Простой пример
a = [1, 2, 3] # создаём список
b = list(a) # создаём копию списка
c = a # создаём еще одну ссылку на список
print(a == b) # True - содержимое списка и копии равно друг другу
print(a is b) # False - но это два разных объекта
print(a == c) # True - объект равен самому себе
print(a is c) # True - потому что это один и тот же объект