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

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

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

А также я не получаю эту часть книги:

Присвоение переменной None переменной является одним из способов: reset to to его исходное, пустое состояние.

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

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

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

Финал:

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

Ответ 1

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

Присвоение переменной None переменной является одним из способов: reset to to его исходное, пустое состояние.

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

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

F = "fork"

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

F = None

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

Что Бриггс просит вас представить, так это то, что вы не пишете наклейку "F", на None уже была надпись F, и все, что вы сделали, было перемещение, от None до "fork". Поэтому, когда вы вводите F = None, вы "reset [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, , потому что такой стикер не существует. Если Briggs были правы и F = None сбрасывает F в исходное состояние, то он должен быть там сейчас, и мы должны увидеть

>>> print(F)
None

как и после ввода F = None, и наклейка на None.


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

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

Ответ 2

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 - тоже значение, хотя оно часто используется для оповещения о пустоте. Книга, которую вы читаете, вводит в заблуждение в этот момент.

Ответ 3

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

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

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

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

  • Сначала подтвердите тип None

    print type(None)
    print None.__class__
    

    Выход

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

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

  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
    

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

  • None - это экземпляр NoneType
  • None не может иметь новых атрибутов
  • Существующие атрибуты None не могут быть изменены.
  • Мы не можем создавать другие экземпляры NoneType
  • Мы не можем даже изменить ссылку на None, присвоив ей значения.

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

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

Ответ 4

В книге, на которую вы ссылаетесь, явно пытается значительно упростить смысл 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 как обычный ввод.
>>> test(-1)
no x here

упс!

Итак, книга немного вводит в заблуждение в основном в использовании слова reset - присвоение None имени - это сигнал программисту о том, что это значение не используется или что функция должна вести себя в некотором по умолчанию, но до reset значения к исходному состоянию undefined вы должны использовать ключевое слово 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

Ответ 5

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

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

None ничего не значит, он не имеет значения.

Ничего не принимает значение False.

Ответ 6

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


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

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

Ответ 7

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

Пример:

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.

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

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

Ответ 8

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