Перейти до змісту

Відмінності між a == b та a is b

== перевіряє значення, а is перевіряє, що обидві змінні посилаються на той самий об'єкт. Для перевірки того, що значення однієї змінної дорівнює якомусь іншому значенню, треба використовувати ==.

Із рекомендацій PEP 8: порівняння з None, завжди слід робити з is або is not, ніколи не з операторами рівності ==, !=:

data is None
data is not None

PEP 8

Comparisons to singletons like None should always be done with is or is not, never the equality operators.

Also, beware of writing if x when you really mean if x is not None – e.g. when testing whether a variable or argument that defaults to None was set to some other value. The other value might have a type (such as a container) that could be false in a boolean context!

В інших випадках краще використовувати ==:

len(data) == 4
len(data) != 4

Приклад використання is (sw2 посилається на той самий список, що і sw1):

In [1]: sw1 = [10, 20, 30]

In [2]: sw2 = sw1

In [3]: sw1 is sw2 # (1)
Out[3]: True

In [4]: sw1 == sw2 # (2)
Out[4]: True
  1. sw1 та sw2 посилаються на той самий список, тому is повертає True
  2. оскільки це один і той же список, значення однакові

Змінні sw1 та sw2 посилаються на різні об'єкти з однаковими елементами:

In [6]: sw1 = [10, 20, 30]

In [7]: sw2 = [10, 20, 30]

In [8]: sw1 is sw2 # (1)
Out[8]: False

In [9]: sw1 == sw2 # (2)
Out[9]: True

  1. sw1 та sw2 посилаються на різні списки, тому is повертає False
  2. у списках однакові елементи, тому == повертає True

True/False

PEP 8

Don't compare boolean values to True or False using ==:

# Correct:
if greeting:
# Wrong:
if greeting == True:

Worse:

# Wrong:
if greeting is True:

Відповідно до рекомендацій PEP8, щоб перевірити, що якийсь об'єкт дорівнює True або False, краще використовувати такі вирази:

if value: # для True
    print("істинне значення")

if not value: # для False
    print("хибне значення")

Приклади використання is поза темами курсу

Приклад функції для скасування задач asyncio, яка має скасувати всі задачі, окрім себе:

async def cancel_all_tasks():
    tasks = [
        task for task in asyncio.all_tasks()
        if task is not asyncio.current_task()
    ]
    [task.cancel() for task in tasks]
    await asyncio.gather(*tasks, return_exceptions=True)