NoneTypeNoneNone с другими типами данныхАннотация. Урок посвящен типу данных NoneType.
Во многих языках программирования (Java, C++, C#, JavaScript и т.д.) существует ключевое слово null, которое можно присвоить переменным. Концепция ключевого слова null заключается в том, что оно дает переменной нейтральное или "нулевое" поведение.
В языке Python, слово null заменено на None, поскольку слово null звучит не очень дружелюбно, а None относится именно к требуемой функциональности – это ничего и не имеет поведения.
Литерал None в Python позволяет представить null переменную, то есть переменную, которая не содержит какого-либо значения. Другими словами, None – это специальная константа, означающая пустоту. Если более точно, то None – это объект специального типа данных NoneType.

Следующий программный код:
var = None
print(type(var))
выведет:
<class 'NoneType'>
Мы можем присвоить значение None любой переменной, однако мы не можем самостоятельно создать другой NoneType объект.
Все переменные, которым присвоено значение None, ссылаются на один и тот же объект типа NoneType. Создание собственных экземпляров типа NoneType недопустимо. Объекты, существующие в единственном экземпляре, называются синглтонами.
Для того чтобы проверить значение переменной на None, мы используем либо оператор is, либо оператор проверки на равенство ==.
Следующий программный код:
var = None
if var is None: # используем оператор is
print('None')
else:
print('Not None')
выведет:
None
Следующий программный код:
var = None
if var == None: # используем оператор ==
print('None')
else:
print('Not None')
выведет:
None
Для сравнения переменной с None всегда используйте оператор is. Для встроенных типов поведение is и == абсолютно одинаково, однако с пользовательскими типами могут возникнуть проблемы, так как в Python есть возможность переопределения операторов сравнения в пользовательских типах.
Сравнение None с любым объектом, отличным от None, дает значение False.
Следующий программный код:
print(None == None)
выведет:
True
Следующий программный код:
print(None == 17)
print(None == 3.14)
print(None == True)
print(None == [1, 2, 3])
print(None == 'Beegeek')
выведет:
False
False
False
False
False
Важно понимать, что следующий программный код:
print(None == 0)
print(None == False)
print(None == '')
выведет:
False
False
False
Значение None не отождествляется со значениями 0, False, ''.
Сравнивать None с другими типами данных можно только на равенство.
Следующий программный код:
print(None > 0)
print(None <= False)
приводит к ошибке:
TypeError: '>' not supported between instances of 'NoneType' and 'int' ('bool')
Примечание 1. Обратите внимание, что функции, не возвращающие значений, на самом деле, в Python возвращают значение None:
def print_message():
print('Я - Тимур,')
print('король матана.')
Мы можем вызвать функцию print_message() так:
print_message()
или так:
res = print_message()
В переменной res хранится значение None.
Примечание 2. Концепция null значений появилась при создании языка ALGOL W великим Чарльзом Хоаром, который позднее назвал собственную идею ошибкой на миллиард долларов. Подробнее можно почитать тут.
Чарльз Хоар - автор одного из самых быстрых алгоритмов сортировки, основанной на сравнениях: быстрая сортировка (QuickSort).