Неинициализированное значение в Python?

Что такое неинициализированное значение в Python, поэтому я могу сравнить, если что-то инициализировано, например:

val

if val == undefined ?

EDIT: добавлено псевдо-ключевое слово.

EDIT2: Я думаю, что я не дал понять это, но скажем, что val уже существует, но ему ничего не назначено.

Дубликат: Просто объявление переменной в Python?

Ответ 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 в коде