2 Сравнение по `is` vs` == `

Типичная ошибка является запутанными операторы сравнения равенства is и == .

a == b сравнивает значение и a b .

a is b сравнит тождества и a b .

Проиллюстрировать:

 a = 'Python is fun!'
b = 'Python is fun!'
a == b # returns True
a is b # returns False

a = [1, 2, 3, 4, 5]
b = a      # b references a
a == b     # True
a is b     # True
b = a[:]   # b now references a copy of a
a == b     # True
a is b     # False [!!]

 

В принципе, is можно рассматривать как сокращение для id(a) == id(b) .

Помимо этого, существуют особенности среды выполнения, которые еще больше усложняют ситуацию. Короткие строки и небольшие целые числа будут возвращать True , по сравнению с is , из - за машины Python пытается использовать меньше памяти для одинаковых объектов.

 a = 'short'
b = 'short'
c = 5
d = 5
a is b # True
c is d # True

 

Но более длинные строки и большие целые числа будут храниться отдельно.

 a = 'not so short'
b = 'not so short'
c = 1000
d = 1000
a is b # False
c is d # False

 

Вы должны использовать is , чтобы проверить на None :

 if myvar is not None:
    # not None
    pass
if myvar is None:
    # None
    pass

 

Применение по is является проверка на «дозорных» (то есть уникальный объект).

 sentinel = object()
def myfunc(var=sentinel):
    if var is sentinel:
        # value wasn’t provided
        pass
    else:
        # value was provided
        pass