Что значение "None"?
Я изучал Python, и я прочитал главу, которая описывает None значение, но, к сожалению, эта книга не очень понятно в некоторых моментах. Я думал, что найду ответ на свой вопрос, если поделюсь им там.
Я хочу знать, что None стоимостью и и для чего вы его используете?
и еще, я не понимаю эту часть книги:
присвоить значение
Noneк переменной-это один из способов ее сброса к
его исходное, пустое состояние.
что это значит?
ответы были великолепны, хотя я не понимал большинство ответов из-за моего низкого знания компьютерного мира (я не узнал о классах, объектах и т. д.). Что означает это предложение?
присвоить значение
Noneк переменной-это один из способов ее сброса
в исходное, пустое состояние.
финал:
наконец-то я получил свой ответ от поиска до разных ответов. Я должен ценить всех людей, которые вкладывают свое время, чтобы помочь мне (особенно Martijn Pieters и DSM), и я хотел бы, чтобы я мог выбрать все ответы как лучшие, но выбор ограничен одним. Все ответы были великолепны.
8 ответов:
Мартейн объясняет, что
Noneнаходится в Python, и правильно заявляет, что книга вводит в заблуждение. Так как программисты Python как правило никогда бы не сказалиприсвоить значение
Noneк переменной-это один из способов сбросить его его исходное, пустое состояние.трудно объяснить, что Бриггс имеет в виду таким образом, который имеет смысл и объясняет, почему никто здесь не кажется счастливым с ним. Одна аналогия, которая может помочь:
In Python, имена переменных похожи на наклейки, нанесенные на объекты. Каждая наклейка имеет уникальное имя, написанное на ней, и она может быть только на одном объекте одновременно, но вы можете поместить более одной наклейки на один и тот же объект, если хотите. Когда вы пишете
F = "fork"вы ставите наклейку " F " на строковый объект
"fork". Если вы тогда пишетеF = Noneвы перемещаете наклейку в
None- это просто значение, которое обычно используется для обозначения 'пустой', или 'не здесь'. Это сигнал объекта; он имеет значение только потому, что документация Python говорит, что он имеет это значение.существует только одна копия этого объекта в данном сеансе интерпретатора Python.
если вы пишете функцию, и эта функция не использует явное
returnзаявлениеNoneне возвращается, например. Таким образом, Программирование с помощью функции значительно упрощены; функция всегда возвращает что-то, даже если это только один
это документация Python должен сказать о
None:единственное значение типов.NoneType. Не часто используется для представления отсутствие значения, а когда аргументы по умолчанию не передается функция.
изменено в версии 2.4: задания не являются незаконными и поднять Синтаксис ошибка.
обратите внимание на имена 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.
давайте попробуем добавить новые атрибуты к
Nonesetattr(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экземпляр изNoneTypeNoneне может иметь новые атрибуты- существующие атрибуты
Noneизменить нельзя.- мы не можем создавать другие экземпляры
NoneType- мы даже не можем изменить ссылку на
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как обычный вход.>>> test(-1) no x hereупс!
таким образом, книга немного вводит в заблуждение в основном в своем использовании слова сброс назначение
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
None-это одноэлементный объект (имеется в виду только один None), используемый во многих местах языка и библиотеки для представления отсутствия какого-либо другого значения.
например:
еслиdсловари,d.get(k)вернутсяd[k]если он существует, ноNoneЕслиdнет ключаk.прочитайте эту информацию из большого блога:http://python-history.blogspot.in/
Я люблю примеры кода (а также фрукты), так что позвольте мне показать вам
apple = "apple" print(apple) >>> apple apple = None print(apple) >>> NoneNone ничего не значит, оно не имеет значения.
значение None равно False.
другие ответы уже объяснили значение нет красиво. Тем не менее, я все равно хотел бы пролить больше света на это, используя пример.
пример:
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 to будьте равны [10] и list3 будет равна ['a'], думая, что аргумент списка будет установлено в значение по умолчанию [] каждый раз, когда вызывается extendList.
однако, что на самом деле происходит это новый список по умолчанию создается только один раз, когда функция определена, и этот же список затем используется впоследствии всякий раз, когда extendList вызывается без указания аргумента списка. Это потому что выражения в аргументах по умолчанию вычисляются при определении функции, а не при ее вызове.
list1 и list3 поэтому работают в том же списке по умолчанию, тогда как list2 работает с отдельным списком, который он создал (передавая свой собственный пустой список в качестве значения для параметра list).
'None' Спаситель: (изменить пример выше, чтобы произвести желаемое поведение)
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
Comments