Неинициализированное значение в Python? - PullRequest
2 голосов
/ 20 марта 2009

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

val

if val == undefined ?

РЕДАКТИРОВАТЬ: добавлено псевдо-ключевое слово.

РЕДАКТИРОВАТЬ 2: Я думаю, что я не дал понять, но сказать, что val уже там, но ничего не назначено ему.

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

Ответы [ 9 ]

8 голосов
/ 20 марта 2009

Будет выброшено исключение 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')
5 голосов
/ 20 марта 2009

Имя не существует, если ему не присвоено значение. Существует None, который обычно не представляет полезного значения, но это само по себе значение.

5 голосов
/ 20 марта 2009

В python переменные либо ссылаются на объект, либо их не существует. Если они не существуют, вы получите NameError. Конечно, один из объектов, на которые они могут ссылаться, это None.

try:
   val
except NameError:
   print "val is not set"


if val is None:
   print "val is None"
1 голос
/ 20 марта 2009

Обычно значение None используется, чтобы пометить что-то как "объявленное, но еще не инициализированное; я бы посчитал неинициализированную переменную дефектом в коде

1 голос
/ 20 марта 2009

Этот вопрос приводит к некоторым забавным отклонениям относительно природы объектов python и их сборщика мусора:

Вероятно, полезно понимать, что все переменные в python действительно являются указателями, то есть они являются именами в пространстве имен (реализованном в виде хеш-таблицы), которые указывают на адрес в памяти, где фактически находится объект.

Запрос значения неинициализированной переменной - это то же самое, что запрос значения объекта, на который указывает указатель, когда указатель еще не создан ... это, очевидно, глупость, поэтому самая разумная вещь, которую Python может сделать сделать - бросить значимую ошибку NameError.

Еще одна странность языка Python заключается в том, что, возможно, объект существует задолго до того, как вы выполните оператор присваивания. Рассмотрим:

a = 1

Вы волшебным образом создали здесь объект int (1)? Нет - это уже существовало. Поскольку int (1) является неизменяемым синглтоном, на него уже есть несколько сотен указателей:

>>> sys.getrefcount(a)
592
>>>

Весело, а?

РЕДАКТИРОВАТЬ: комментарий от 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
1 голос
/ 20 марта 2009

В Python, чтобы переменная существовала, ей должно быть назначено что-то. Вы можете представить себе имя переменной как ключ словаря, с которым должно быть связано какое-то значение (даже если это значение равно None).

0 голосов
/ 20 марта 2009

В: Как я могу определить, определена ли переменная в точке моего кода?

A: Читайте в исходном файле, пока не увидите строку, где определена эта переменная.

0 голосов
/ 20 марта 2009

Чтобы добавить к ответу phihag : вы можете использовать dir(), чтобы получить список всех переменных в текущей области, так что если вы хотите проверить, если var находится в текущей области без использования исключений, вы можете сделать:

if 'var' in dir():
    # var is in scope
0 голосов
/ 20 марта 2009
try:
    print val
except NameError:
    print "val wasn't set."
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...