Неинициализированное значение в Python?
Что такое неинициализированное значение в Python, поэтому я могу сравнить, если что-то инициализировано, например:
val
if val == undefined ?
EDIT: добавлено псевдо-ключевое слово.
EDIT2: Я думаю, что я не дал понять это, но скажем, что val уже существует, но ему ничего не назначено.
Ответы
Ответ 1
Выбрасывает исключение NameError
:
>>> val
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'val' is not defined
Вы можете либо поймать это, либо использовать 'val' in dir()
, т.е.:
try:
val
except NameError:
print("val not set")
или
if 'val' in dir():
print('val set')
else:
print('val not set')
Ответ 2
В python переменные либо относятся к объекту, либо не существуют. Если они не существуют, вы получите NameError. Конечно, одним из объектов, на которые они могут ссылаться, является None
.
try:
val
except NameError:
print "val is not set"
if val is None:
print "val is None"
Ответ 3
Имя не существует, если ему не присвоено значение. Существует None, который обычно не представляет полезной ценности, но это значение само по себе.
Ответ 4
В Python для существования переменной необходимо что-то ей назначить. Вы можете думать о своем имени переменной в качестве словарного ключа, который должен иметь некоторое значение, связанное с ним (даже если это значение равно None).
Ответ 5
Этот вопрос приводит к некоторым забавным отклонениям в отношении природы объектов python и сборщика мусора:
Вероятно, полезно понять, что все переменные в python действительно являются указателями, то есть они являются именами в пространстве имен (реализованы как хеш-таблица), которые указывают на адрес в памяти, где фактически находится объект.
Запрос значения неинициализированной переменной совпадает с запросом на значение, на которое указывает указатель, когда указатель еще не создан... это, очевидно, бессмыслица, поэтому самая разумная вещь Python может do - это выброс значимого NameError.
Другая странность языка python заключается в возможности существования объекта задолго до того, как вы выполните оператор присваивания. Рассмотрим:
a = 1
Волшебно ли вы создали объект int (1) здесь? Нет, он уже существовал. Поскольку int (1) является неизменным синглтоном, для него уже существует несколько сотен указателей:
>>> sys.getrefcount(a)
592
>>>
Веселье, а??
EDIT: commment от JFS (размещен здесь, чтобы показать код)
>>> a = 1 + 1
>>> sys.getrefcount(a) # integers less than 256 (or so) are cached
145
>>> b = 1000 + 1000
>>> sys.getrefcount(b)
2
>>> sys.getrefcount(2000)
3
>>> sys.getrefcount(1000+1000)
2
Ответ 6
try:
print val
except NameError:
print "val wasn't set."
Ответ 7
Чтобы добавить к ответ phihag: вы можете использовать dir()
для получить список всех переменных в текущей области, поэтому, если вы хотите проверить, находится ли var
в текущей области без использования исключений, вы можете сделать:
if 'var' in dir():
# var is in scope
Ответ 8
В: Как узнать, определена ли переменная в точке моего кода?
A: прочитайте в исходном файле, пока не увидите строку, в которой эта переменная определена.
Ответ 9
Обычно значение None
используется для обозначения чего-то как "объявленного, но еще не инициализированного: я бы рассмотрел неинициализированную переменную defekt в коде