В Python нет нуля; вместо этого есть None. Null называется None в Python, это специальный объект NoneType, представляющий отсутствие значения. Нулевой объект — это синглтон None. Null — это уникальное значение в Python, которое показывает, что переменная ни на что не указывает.
«None» относится именно к предполагаемой функциональности — это «ничего» и не имеет никакого поведения.
Многие языки программирования используют Null для представления указателя, который ни на что не указывает. Это заполнитель, когда переменная пуста или для обозначения параметров по умолчанию, которые вы не указали. Null часто определяется как 0 в этих языках, но Null в Python отличается.
- Разница между Null и None в Python
- Почему null имеет значение в Python?
- None в Python
- Как установить значение None?
- Доказательство того, что None является объектом
- Интересные факты о None
- Объявление None в Python
- Вернуть nullв Python
- is not null в Python
- Использование None как часть сравнения
- Разница между операторами == и is в Python
- Проверка типа None
- Использование None в качестве значения в Python
- Проверка None с использованием условия if…else
- В Python может быть только один None
- Как проверить, если значение None
- None в трассировках
- Заключение
Разница между Null и None в Python
В Python нет Null, как и в других языках программирования. Вместо этого есть None. Null часто определяется как 0 в разных языках программирования, но Null в Python отличается.
Python использует None по-другому, потому что он определяет нулевые объекты и переменные.
Почему null имеет значение в Python?
Null имеет значение в Python, потому что он представляет собой отсутствие значения. Null можно использовать в качестве заполнителя для неизвестного или неинициализированного значения. Если функция не возвращает никакого значения, она возвращает None.
Null заслуживает особого назначения в Python, и это не означает значение 0. None или Null — это гражданин первого класса.
None в Python
None в Python используется для описания нулевого значения или его отсутствия. «None» означает Falsy.value или пустая строка. None является собственными данными (NoneType), и только None может быть None.
Если вы определяете функцию с оператором return или без значения, она возвращает None.
|
1 2 3 4 5 |
def python_none(): pass print(python_none()) |
Выход
|
1 |
None |
Когда вы вызываете функцию python_none(), она возвращает None, потому что нет оператора return. Вместо этого есть только оператор pass. None не имеет выходного значения, но печать показывает None в консоли Python, явно заставляя нас печатать вывод.
None указывает на отсутствующие параметры или параметры по умолчанию. Например, None дважды встречается в документах для функции list.sort().
|
1 |
print(help(list.sort)) |
Выход
|
1 2 3 4 5 6 7 8 9 10 |
sort(self, /, *, key=None, reverse=False) Sort the list in ascending order and return None. The sort is in-place(i.e. the list itself is modified) and stable(i.e. the order of two equal elements is maintained). If a key function is given, apply it once to each list item and sort them, ascending or descending, according to their function values. The reverse flag can be set to sort in descending order. |
В выводе видно, что ключ параметра имеет значение None. Это означает, что ключевой параметр необходим, но мы его не указали; именно поэтому параметр по умолчанию — None.
Как установить значение None?
Чтобы установить значение None в Python, назначьте объект None переменной, которая станет None.
|
1 |
data = None |
В приведенном выше коде вы можете видеть, что мы устанавливаем переменную данных в None с помощью оператора присваивания.
Доказательство того, что None является объектом
None — это синглтон, и класс NoneType дает вам только один и тот же единственный экземпляр None. В нашей программе Python есть только один None.
|
1 2 3 4 5 |
NoneObj = type(None)() print(NoneObj) # Check if NoneObj is instance of NoneType class print(NoneObj is None) |
Это дает следующий вывод.
|
1 2 |
None True |
Даже если вы попытаетесь создать новый экземпляр, вы все равно получите существующий None.
Интересные факты о None
- None не то же самое, что False.
- Не является пустой строкой.
- None не 0.
- Сравнение None с чем-либо всегда будет возвращать False, кроме самого None.
Объявление None в Python
Мы можем присвоить объект None любой переменной во время объявления. Переменные Python оживают благодаря оператору присваивания, который помогает нам присвоить переменной определенное значение.
Некоторым языкам программирования не обязательно присваивать начальное значение. Например, начальным значением некоторых переменных может быть Null.
Давайте присвоим значение None переменной в Python и напечатаем переменную в консоли.
|
1 2 |
data = None print(None) |
Выход
|
1 |
None |
Если мы не определим переменную и не напечатаем ее значение напрямую, мы получим NameError.
|
1 |
print(data) |
Выход
|
1 2 3 4 |
Traceback(most recent call last): File "app.py", line 2, in <module> print(data) NameError: name 'data' is not defined |
Все переменные в Python оживают благодаря оператору присваивания. Переменная может начать жизнь как Null, только если вы назначите None. Если вы не определите переменную и попытаетесь напрямую распечатать в консоли, вы получите NameError.
Вернуть null в Python
Чтобы вернуть null в Python, используйте ключевое слово None. В Python нет такого термина, как «return null». Вместо этого каждая функция возвращает некоторое значение.
Python рассматривает его как возвращающий None, если не используется явный оператор возврата.
|
1 2 3 4 5 6 |
def FuncNull(data): print(data) return None print(FuncNull("Function Called")) |
Выход
|
1 2 |
Function Called None |
is not null в Python
Чтобы проверить, является ли переменная нулевой в Python, используйте оператор «is not». Операторы Python «is» и «is not» — это операторы сравнения, которые сравнивают идентичность двух объектов. Например, python «is operator» — это проверка идентичности. Он проверяет, являются ли правая и левая стороны одним и тем же объектом.
|
1 2 3 4 |
var = "Stranger Things 4 Vecna" if var is not None: print('Var is not null') |
Выход
|
1 |
Var is not null |
Вы можете видеть, что var не равно null или None. Вот почему, если условие имеет значение True, напечатается значение.
Использование None как часть сравнения
В Python нет нуля. Вместо этого есть None. Как уже говорилось, самый точный способ проверить, что чему-то было присвоено None в качестве значения, — это использовать оператор идентификации, который проверяет, относятся ли две переменные к одному и тому же объекту.
В Python для представления отсутствия значения вы можете использовать значение None(types.NoneType.None) для объектов и «»(или len() == 0) для строк.
Что касается разницы между «==» и «is», проверки на предмет идентичности объекта с использованием «==» должно быть достаточно.
Однако, поскольку операция «is» определяется как операция идентификации объекта, возможно, правильнее использовать именно ее, а не «==». Не уверен, что есть даже разница в скорости.
При проверке значений None необходимо помнить о важных практических правилах:
- Использовать операторы идентификации is и not is.
- Не использовать операторы равенства == и !=.
Разница между операторами == и is в Python
Разница между операторами == и is в Python заключается в том, что оператор == сравнивает значения обоих операндов и проверяет равенство значений. В то же время оператор is проверяет, относятся ли оба операнда к одному и тому же объекту.
См. следующий код.
|
1 2 |
eleven = None print(eleven is None) |
См. следующий вывод.
|
1 |
True |
Теперь посмотрите на следующий код.
|
1 2 3 4 5 6 7 |
def python_none(): pass data = python_none() print(data == None) print(data is None) |
Выход
|
1 2 |
True True |
Этот код возвращает None, и мы проверяем, что данные действительно равны None.
Но операторы равенства можно обмануть, когда вы сравниваете пользовательские объекты, которые переопределяют их.
|
1 2 3 4 5 6 7 8 |
class isAndDoubleEqual: def __eq__(self, other): return True res = isAndDoubleEqual() print(res == None) print(res is None) |
Выход
|
1 2 |
True False |
Оператор равенства == возвращает неверный ответ.
Тождество оператора is возвращает правильный ответ, потому что вы не можете переопределить его.
Проверка типа None
В других языках программирования Null — это просто синоним 0, но Null в Python — это объект.
Проверьте тип None с помощью метода type().
|
1 |
print(type(None)) |
Выход
|
1 |
<class 'NoneType'> |
Это показывает, что None является объектом, а его тип данных — NoneType.
Ни один из них сам по себе не встроен в язык, как Null в Python. Однако вы можете проверить это, распечатав файл dir(__builtins__).
|
1 |
print(dir(__builtins__)) |
Он напечатает следующие встроенные элементы.
|
1 |
['ArithmeticError',..., None,....., zip |
Использование None в качестве значения в Python
Мы можем передать None в качестве параметра функции в Python и добавить его в список. Во-первых, мы определим класс, а не его тело. Затем мы создаем функцию с именем list_function(), которая принимает два параметра.
- new_item: Этот элемент будет добавлен в список, если мы передадим его при вызове функции.
- initial_list: в качестве параметра по умолчанию список должен быть None, но если мы передадим какой-либо аргумент явно, он вернет исходный список.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class DoAppendNone: pass def list_function(new_item=DoAppendNone, initial_list=None): if initial_list is None: initial_list = [] if new_item is not DoAppendNone: initial_list.append(new_item) return initial_list data = [1, 2, 3, 4, 5] print(list_function(initial_list=data)) |
Выход
|
1 |
[1, 2, 3, 4, 5] |
Мы передали два параметра со значением по умолчанию list_function().
- new_item = DoAppendNone
- initial_list = None
В коде мы передали initial_list как данные, потому что у нас есть список данных, состоящий из пяти элементов.
Итак, при вызове функции наш initial_list = data.
Это означает, что внутри функции мы проверили, имеет ли initial_list значение None, но это None, поскольку у нас есть список элементов в данных, поэтому это условие будет False.
Второе условие — new_element не должен быть DoAppendNone, но он есть. Так что это условие также будет False. Таким образом, новый элемент не будет добавлен в список. Наконец, предоставленный список данных будет возвращен в качестве вывода.
А что, если None является допустимым входным объектом? Например, что, если list_function() может либо вставить элемент в список, либо нет, а None является допустимым элементом для добавления?
В этом случае вы можете определить класс специально для использования по умолчанию, в то же время отличаясь от None.
Итак, давайте напишем программу, которая вставляет значение None в качестве элемента в список.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
class DoAppendNone: pass def list_function(new_item=DoAppendNone, initial_list=None): if initial_list is None: initial_list = [] if new_item is not DoAppendNone: initial_list.append(new_item) return initial_list data = [1, 2, 3, 4, 5] print(list_function(None, data)) |
Выход
|
1 |
[1, 2, 3, 4, 5, None] |
Здесь класс DoAppendNone служит сигналом не добавлять, поэтому вам не нужен None. Это освобождает нас от необходимости вставлять None всякий раз, когда мы хотим.
Проверка None с использованием условия if…else
Мы можем написать следующий код, чтобы проверить, равно ли значение None.
|
1 2 3 4 5 6 |
value = None if value is None: print('The value is null') else: print('The value is not null') |
В приведенном выше примере мы определили переменную с именем value и присвоили ей значение None.
Затем мы использовали условие if…else, чтобы проверить значение None, и, если это так, вернуть оператор печати с «Значение равно null».
Мы можем использовать следующий код, чтобы проверить, существует ли имя.
|
1 2 3 4 |
try: val except NameError: pass # val does not exist at all |
В Python может быть только один None
None — это встроенная константа, как только вы запускаете Python, будь то в модуле, классе или функции. NonType, напротив, is not; вам нужно сначала получить ссылку на него, запросив None для его класса.
|
1 2 3 4 |
>>> NoneType NameError: name 'NoneType' is not defined >>> type(None) NoneType |
Ни один из них не может быть перезаписан.
До Python 2.4 можно было переназначить None, но больше нельзя. Даже в качестве атрибута класса или в пределах функции.
Как проверить, если значение None
Зачем это делать
|
1 |
value is None |
скорее, чем
|
1 |
value==None |
Первый эквивалентен:
|
1 |
id(value)==id(None) |
Принимая во внимание, что выражение value==None применяется таким образом,
|
1 |
value.__eq(None)__ |
если значение равно None, вы получите то, что ожидали.
|
1 2 3 |
>>> nothing = function_that_does_nothing() >>> nothing.__eq__(None) True |
Это потому, что ни один из них не имеет особого статуса в языке Python. Это предпочтительное базовое значение, поскольку многие алгоритмы считают его исключительным.
В таких сценариях его можно использовать в качестве флага, сигнализирующего о том, что условие требует специальной обработки, например установки значения по умолчанию.
None в трассировках
Когда NoneType появляется в вашей трассировке, это означает, что то, что вы не ожидали быть None, было None, и вы пытались применять его в таких случаях, где вы не можете использовать None. Почти всегда это происходит потому, что вы пытаетесь вызвать для него метод.
|
1 2 3 4 5 6 7 8 |
data = [1, 2, 3, 4, 5] data.append(6) print(data) data = None data.append(11) print(data) |
Выход
|
1 2 3 4 5 |
[1, 2, 3, 4, 5, 6] Traceback(most recent call last): File "app.py", line 7, in <module> data.append(11) AttributeError: 'NoneType' object has no attribute 'append' |
Когда мы определяем список с некоторыми начальными значениями, он может вызывать функцию list.append() для добавления элемента в список, но когда мы определяем список как None, это означает, что теперь этот список не является традиционным списком Python, что list теперь имеет значение None, а объект None не имеет метода append() для работы, поэтому он выдает ошибку AttributeError.
Когда вы увидите в своем коде трассировку, подобную приведенной выше, найдите первый атрибут, вызвавший ошибку. Здесь это метод append(). Далее вы увидите объект, который вы пытались оттуда вызвать. Наконец, выясните, как этот объект стал None, и примите необходимые меры для исправления кода.
Заключение
None в Python — неизменяемое ключевое слово и мощный инструмент, такой как True или False. Ни один из них не может быть протестирован с использованием операторов in или not in. В трассировках None может помочь найти точную проблему, и мы можем исправить ее, решив проблему Null.
В любой программе Python может быть только один None, и даже если вы создаете экземпляр класса NoneType, может быть только один None.
