Дополнительно
нулевой объект в Python?
Как ссылаться на объект null в Python?
1086
5
Как ссылаться на объект null в Python?
В Python объектом 'null' является синглтон
None
.Лучший способ проверить объект на "неидентичность" - использовать оператор тождества
is
:None
, нуль в Python?В Python нет понятия
null
, вместо него естьNone
. Как уже говорилось, самый точный способ проверить, что чему-то было присвоено значениеNone
- это использовать оператор тождестваis
, который проверяет, что две переменные относятся к одному и тому же объекту.Основы
Существует и может существовать только одно
None
None
является единственным экземпляром классаNoneType
, и любые дальнейшие попытки инстанцирования этого класса вернут тот же объект, что делаетNone
синглтоном. Новички в Python часто видят сообщения об ошибках, в которых упоминаетсяNoneType
, и задаются вопросом, что это такое. Я лично считаю, что эти сообщения могли бы просто упоминатьNone
по имени, потому что, как мы скоро увидим,None
оставляет мало места для двусмысленности. Так что если вы увидите сообщениеTypeError
, в котором говорится, чтоNoneType
не может делать то-то или то-то, знайте, что это просто одинNone
был использован так, как он не может.Кроме того,
None
- это встроенная константа, как только вы начинаете использовать Python, она доступна для использования отовсюду, будь то модуль, класс или функция. АNoneType
, напротив, нет, вам придется сначала получить ссылку на него, запросив уNone
его класс.Уникальность
None
можно проверить с помощью функции идентификации Pythonid()
. Она возвращает уникальный номер, присвоенный объекту, у каждого объекта он свой. Если id двух переменных одинаков, то они указывают на один и тот же объект.None
не может быть перезаписано.В гораздо более старой версии Python (до 2.4) можно было переназначить
None
, но теперь нет. Даже в качестве атрибута класса или в пределах функции.Поэтому можно предположить, что все ссылки
None
одинаковы. Не существует "пользовательского"None
.Для проверки на
None
используйте операторis
.При написании кода у вас может возникнуть соблазн проверить Noneness следующим образом:
Или проверить на ложность следующим образом
Вы должны понимать последствия и почему часто полезно быть явным.
Случай 1: проверка, является ли значение
None
.зачем это делать
, а не
Первый вариант эквивалентен:
Тогда как выражение
value==None
на самом деле применяется следующим образомЕсли значение действительно равно
None
, то вы получите то, что ожидали.В большинстве случаев результат будет одинаковым, но метод
__eq__()
открывает дверь, которая лишает всякой гарантии точности, поскольку он может быть переопределен в классе для обеспечения особого поведения.Рассмотрим этот класс.
Вы пробуете его на
None
, и он работает.Но затем он также работает на пустой строке
И все же
Случай 2: Использование
None
в качестве булевой величиныСледующие два теста
на самом деле оцениваются как
None
является "ложным", то есть при приведении к булеву значению он вернетFalse
, а при применении оператораnot
вернетTrue
. Заметьте, однако, что это свойство не является уникальным дляNone
. Помимо самогоFalse
, это свойство разделяют пустые списки, кортежи, множества, dicts, строки, а также 0 и все объекты из классов, реализующих магический метод__bool__()
для возвратаFalse
.Поэтому при тестировании переменных следующим образом будьте особенно внимательны к тому, что вы включаете или исключаете из теста:
В приведенном выше примере вы хотели вызвать
init_value()
, когда значение установлено вNone
, или вы имели в виду, что значение, установленное в0
, или пустая строка, или пустой список также должны вызвать инициализацию. Как я уже сказал, будьте внимательны. Как это часто бывает в Python явное лучше неявного.None
на практике.None
используется как сигнальное значениеNone
имеет особый статус в Python. Это любимое базовое значение, потому что многие алгоритмы рассматривают его как исключительное значение. В таких сценариях его можно использовать как флаг, сигнализирующий о том, что условие требует специальной обработки (например, установки значения по умолчанию).Вы можете присвоить
None
аргументам ключевого слова функции и затем явно проверить его наличие.Вы можете вернуть значение по умолчанию при попытке получить атрибут объекта, а затем явно проверить его, прежде чем делать что-то особенное.
По умолчанию метод
get()
словаря возвращаетNone
при попытке получить доступ к несуществующему ключу:Если бы вы попытались получить доступ к нему, используя нотацию subscript, то возникла бы
KeyError
.Аналогично, если вы попытаетесь открыть несуществующий элемент
который можно подавить с помощью значения по умолчанию, которое обычно устанавливается в
None
None
используется и как флаг, и как допустимое значениеОписанные выше случаи использования
None
применяются, когда оно не считается допустимым значением, а скорее является сигналом для выполнения чего-то особенного. Однако бывают ситуации, когда иногда важно знать, откуда взялсяNone
, потому что, хотя он используется как сигнал, он также может бытьОн называется не null, как в других языках, а
None
. Всегда существует только один экземпляр этого объекта, поэтому при желании можно проверять эквивалентность с помощьюx is None
(сравнение тождества) вместоx == None
.В Python для обозначения отсутствия значения можно использовать значение None (types.NoneType.None) для объектов и "" (или len() == 0) для строк. Поэтому:
Что касается разницы между "==" и "is", то проверки на идентичность объекта с помощью "==" должно быть достаточно. Однако, поскольку операция "is" определена как операция идентификации объекта, вероятно, правильнее использовать ее, а не "==". Не уверен, есть ли разница в скорости.
В любом случае, вы можете взглянуть на:
За правду тестирования значение, 'Нет' напрямую тестов как ложные, так что простейшим выражением будет достаточно: