Что такое значение None?

Я изучал Python, и я прочитал главу, в которой описывается значение None , но, к сожалению, эта книга не очень понятна в некоторых случаях. Я думал, что найду ответ на свой вопрос, если я поделюсь им.

Я хочу знать, что такое значение None и для чего вы его используете?

Кроме того, я не получаю эту часть книги:

Присвоение значения None переменной является одним из способов сброса ее в исходное, пустое состояние.

Что это значит?

Ответы были замечательными, хотя я не понимал большинство ответов из-за низкого знания компьютерного мира (я не узнал о классах, объектах и ​​т. Д.). Что означает это предложение?

Присвоение значения None переменной является одним из способов сброса ее в исходное, пустое состояние.

Финал:

Наконец, я получил ответ от разных ответов. Я должен оценить всех людей, которые приложили свое время, чтобы помочь мне (особенно Martijn Pieters и DSM), и я хочу, чтобы я мог выбрать все ответы как лучшие, но выбор ограничивается одним. Все ответы были замечательными.

8 Solutions collect form web for “Что такое значение None?”

Ответ Martijn объясняет, что None на Python, и правильно утверждает, что книга вводит в заблуждение. Поскольку программисты Python, как правило, никогда не говорили бы

Присвоение значения None переменной является одним из способов сброса ее в исходное, пустое состояние.

трудно объяснить, что означает Бриггс, что имеет смысл и объясняет, почему никто здесь не кажется ему счастливым. Одна аналогия, которая может помочь:

В Python имена переменных похожи на наклейки, наложенные на объекты. Каждая наклейка имеет уникальное имя, написанное на нем, и оно может быть только на одном объекте за раз, но вы могли бы поместить более одного наклейки на один и тот же объект, если хотите. Когда вы пишете

 F = "fork" 

вы помещаете наклейку «F» на строковый объект "fork" . Если вы затем напишите

 F = None 

вы перемещаете наклейку в объект None .

Что Бриггс просит вас представить, так это то, что вы не написали стикер "F" , на « None уже была наклейка F , и все, что вы делали, было перемещение , от « None до "fork" . Поэтому, когда вы вводите F = None , вы «перезагружаете [ting] его в свое исходное, пустое состояние», если мы решили рассматривать None как значение empty state .

Я вижу, к чему он клонит, но это плохой способ взглянуть на него. Если вы запустите Python и напечатайте print(F) , вы увидите

 >>> print(F) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'F' is not defined 

и что NameError означает, что Python не распознает имя F , потому что такой наклейки нет . Если бы Бриггс был прав, а F = None , то он переместил бы F в исходное состояние, тогда он должен быть там сейчас, и мы должны увидеть

 >>> print(F) None 

как мы это делаем после того, как мы наберем F = None и поместим наклейку в None .


Так что все это происходит. На самом деле, Python поставляется с некоторыми наклейками, уже прикрепленными к объектам (встроенные имена), но другим вы должны писать себя с такими линиями, как F = "fork" и A = 2 и c17 = 3.14 , а затем вы можете c17 = 3.14 их другие объекты позже (например, F = 10 или F = None , все равно).

Бриггс притворяется, что все возможные наклейки, которые вы могли бы написать, уже были прикреплены к объекту None .

None это просто значение, которое обычно используется для обозначения «пусто» или «здесь нет значения». Это сигнальный объект ; это имеет смысл только потому, что в документации на Python сказано, что это имеет смысл.

В данном сеансе интерпретатора Python имеется только одна копия этого объекта.

Если вы пишете функцию, и эта функция не использует явный оператор return , вместо этого вместо него возвращается значение None . Таким образом, программирование с функциями значительно упрощается; функция всегда возвращает что-то , даже если это только один объект None .

Вы можете проверить это явно:

 if foo is None: # foo is set to None if bar is not None: # bar is set to something *other* than None 

Другое использование – предоставить необязательные параметры для функций «пустой» по умолчанию:

 def spam(foo=None): if foo is not None: # foo was specified, do something clever! 

Функция spam() имеет необязательный аргумент; если вы вызываете spam() без указания его, ему присваивается значение по умолчанию None , что позволяет легко определить, была вызвана функция с аргументом или нет.

Другие языки имеют схожие понятия. SQL имеет NULL ; JavaScript имеет undefined и null и т. Д.

Обратите внимание, что в Python переменные существуют в силу использования. Вам не нужно сначала объявлять переменную, поэтому в Python нет действительно пустых переменных. Установка переменной в None – это не то же самое, что установка ее на пустое значение по умолчанию; None также значение, хотя оно часто используется для оповещения о пустоте. Книга, которую вы читаете, вводит в заблуждение.

Это то, о чем должна сказать документация Python о None :

Единственное значение типов. NoneType. Ни один из них не используется для представления отсутствия значения, так как аргументы по умолчанию не передаются функции.

Изменено в версии 2.4: Назначения None являются незаконными и повышают значение SyntaxError.

Примечание. Названия None и debug не могут быть переназначены (присваивание им, даже как имя атрибута, повышает значение SyntaxError), поэтому их можно считать «истинными» константами.

  1. Давайте сначала подтвердим тип None

     print type(None) print None.__class__ 

    Вывод

     <type 'NoneType'> <type 'NoneType'> 

В принципе, NoneType – это тип данных, такой как int , float и т. Д. Вы можете проверить список типов по умолчанию, доступных в Python в 8.15. types – Имена для встроенных типов .

  1. И None не является экземпляром класса NoneType . Поэтому мы могли бы захотеть создавать экземпляры « None . Попробуем это

     print types.IntType() print types.NoneType() 

    Вывод

     0 TypeError: cannot create 'NoneType' instances 

Настолько ясно, что нельзя создавать экземпляры NoneType . Нам не нужно беспокоиться о уникальности значения None .

  1. Давайте проверим, как мы реализовали None внутри.

     print dir(None) 

    Вывод

     ['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__'] 

Кроме __setattr__ , все остальные атрибуты доступны только для чтения. Таким образом, мы не можем изменить атрибуты None .

  1. Попробуем добавить новые атрибуты в None

     setattr(types.NoneType, 'somefield', 'somevalue') setattr(None, 'somefield', 'somevalue') None.somefield = 'somevalue' 

    Вывод

     TypeError: can't set attributes of built-in/extension type 'NoneType' AttributeError: 'NoneType' object has no attribute 'somefield' AttributeError: 'NoneType' object has no attribute 'somefield' 

Вышеприведенные действия вызывают эти сообщения об ошибках, соответственно. Это означает, что мы не можем динамически создавать атрибуты экземпляра None .

  1. Давайте проверим, что происходит, когда мы присваиваем что-то None . Согласно документации, он должен SyntaxError . Это означает, что если мы присваиваем что-то None , программа не будет выполняться вообще.

     None = 1 

    Вывод

     SyntaxError: cannot assign to None 

Мы установили, что

  1. None – это экземпляр NoneType
  2. None не может иметь новые атрибуты
  3. Существующие атрибуты None не могут быть изменены.
  4. Мы не можем создавать другие экземпляры NoneType
  5. Мы даже не можем изменить ссылку на None , присвоив ей значения.

Итак, как упоминалось в документации, None может действительно считаться true constant .

Счастливое знание None 🙂

Книга, на которую вы ссылаетесь, явно пытается значительно упростить значение None . Переменные Python не имеют начального, пустого состояния – переменные Python привязаны (только), когда они определены . Вы не можете создать переменную Python, не придавая ей значения.

 >>> print(x) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'x' is not defined >>> def test(x): ... print(x) ... >>> test() Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: test() takes exactly 1 argument (0 given) >>> def test(): ... print(x) ... >>> test() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in test NameError: global name 'x' is not defined 

но иногда вы хотите, чтобы функция означала разные вещи в зависимости от того, определена ли переменная или нет. Вы можете создать аргумент со значением по умолчанию None :

 >>> def test(x=None): ... if x is None: ... print('no x here') ... else: ... print(x) ... >>> test() no x here >>> test('x!') x! 

Тот факт, что это значение является специальным значением None в этом случае не очень важно. Я мог бы использовать любое значение по умолчанию:

 >>> def test(x=-1): ... if x == -1: ... print('no x here') ... else: ... print(x) ... >>> test() no x here >>> test('x!') x! 

… но отсутствие None дает нам два преимущества:

  1. Нам не нужно выбирать особую ценность, например -1 , смысл которой неясен, и
  2. Нашей функции может потребоваться обработать -1 как обычный ввод.
 >>> test(-1) no x here 

упс!

Таким образом, книга немного вводит в заблуждение, главным образом, в использовании слова reset – присвоение None имени означает сигнал программисту о том, что это значение не используется или что функция должна вести себя по-умолчанию, но для сброса значение в исходное, неопределенное состояние, вы должны использовать ключевое слово del :

 >>> x = 3 >>> x 3 >>> del x >>> x Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'x' is not defined 

Мне нравятся примеры кода (а также фрукты), поэтому позвольте мне показать вам

 apple = "apple" print(apple) >>> apple apple = None print(apple) >>> None 

Ничто не означает ничего, оно не имеет ценности.

Никто не оценивает значение False.

None – это одноэлементный объект (имеется в виду только один None), используемый во многих местах языка и библиотеки для представления отсутствия какого-либо другого значения.

Например:
если d – словарь, d.get(k) вернет d[k] если он существует, но None если d не имеет ключа k .

Прочтите эту информацию из большого блога: http://python-history.blogspot.in/

Другие ответы уже объяснили смысл Никого красиво. Тем не менее, я все равно хотел бы рассказать об этом на примере.

Пример:

 def extendList(val, list=[]): list.append(val) return list list1 = extendList(10) list2 = extendList(123,[]) list3 = extendList('a') print "list1 = %s" % list1 print "list2 = %s" % list2 print "list3 = %s" % list3 

Теперь попробуйте угадать вывод выше списка. Ну, ответ на удивление выглядит следующим образом:

 list1 = [10, 'a'] list2 = [123] list3 = [10, 'a'] 

Но почему?

Многие ошибочно ожидают, что list1 будет равен [10], а list3 будет равен ['a'] , считая, что аргумент list будет установлен на значение по умолчанию [] при каждом вызове extendList.

Однако на самом деле происходит то, что новый список по умолчанию создается только один раз, когда функция определена , и тот же список затем используется впоследствии всякий раз, когда extensionList вызывается без указателя списка. Это объясняется тем, что выражения в аргументах по умолчанию вычисляются, когда функция определена, а не когда она вызывается .

list1 и list3 работают в одном и том же списке по умолчанию, тогда как list2 работает в отдельном списке, который он создал (передав свой собственный пустой список в качестве значения для параметра списка).


«Нет» спасителя: (Измените пример выше, чтобы создать желаемое поведение)

 def extendList(val, list=None): if list is None: list = [] list.append(val) return list list1 = extendList(10) list2 = extendList(123,[]) list3 = extendList('a') print "list1 = %s" % list1 print "list2 = %s" % list2 print "list3 = %s" % list3 

С помощью этой пересмотренной реализации результатом будет:

 list1 = [10] list2 = [123] list3 = ['a'] 

Примечание. Пример кредита toptal.com

 largest=none smallest =none While True : num =raw_input ('enter a number ') if num =="done ": break try : inp =int (inp) except: Print'Invalid input' if largest is none : largest=inp elif inp>largest: largest =none print 'maximum', largest if smallest is none: smallest =none elif inp<smallest : smallest =inp print 'minimum', smallest print 'maximum, minimum, largest, smallest 
  • Назначение кортежа Python и проверка в условных операторах
  • ошибка программы python elif else if
  • Inline условно между более чем двумя значениями
  • Если и Inline, если, какие преимущества и недостатки?
  • Python: что делает полуколона?
  • Составление списка с условием
  • Более короткий способ операторов if в python
  • питон. если var == False
  • Pythonic способ увеличения и назначения идентификаторов из словаря
  • Что означает это выражение «если»?
  • python - Имитация «else» в операторах switch
  • Python - лучший язык программирования в мире.