Что такое значение 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. типы - имена для встроенных типов.
-
И None
- это экземпляр класса NoneType
. Поэтому мы можем захотеть создать экземпляры None
сами. Попробуем, чтобы
print types.IntType()
print types.NoneType()
Выход
0
TypeError: cannot create 'NoneType' instances
Так ясно, что невозможно создать экземпляры NoneType
. Нам не нужно беспокоиться об уникальности значения None
.
-
Проверьте, как мы реализовали None
внутренне.
print dir(None)
Выход
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__',
'__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__',
'__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
За исключением __setattr__
, все остальные атрибуты доступны только для чтения. Таким образом, мы не можем изменить атрибуты None
.
-
Попробуйте добавить новые атрибуты в 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
.
-
Давайте проверим, что происходит, когда мы присваиваем что-то 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