Возможно ли объявить переменную без присвоения значения в Python?

Можно ли объявить переменную в Python, например?:

var

чтобы он инициализировался None? Похоже, что Python позволяет это, но как только вы обращаетесь к нему, он падает. Это возможно? Если нет, то почему?

EDIT: Я хочу сделать это для таких случаев:

value

for index in sequence:

   if value == None and conditionMet:
       value = index
       break

Duplicate

Связанные

Ответ 1

Почему бы просто не сделать это:

var = None

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

Это хорошо, потому что вы никогда не получите неинициализированную переменную. Но будьте осторожны - это не означает, что вы не получите неправильно инициализированных переменных. Если вы инициируете что-то в None, убедитесь, что вы действительно хотите, и назначьте что-то более значимое, если сможете.

Ответ 2

Я бы сердечно рекомендовал вам читать Другие языки имеют "переменные" (я добавил его как ссылку) - через две минуты вы "Я знаю, что у Python есть" имена ", а не "переменные".

val = None
# ...
if val is None:
   val = any_object

Ответ 3

Я не уверен, что вы пытаетесь сделать. Python - очень динамичный язык; вам обычно не нужно объявлять переменные, пока вы на самом деле не собираетесь их назначать или использовать. Я думаю, что вы хотите сделать только

foo = None

который присваивает значение None переменной foo.

EDIT: То, что вы действительно хотите сделать, это просто:

#note how I don't do *anything* with value here
#we can just start using it right inside the loop

for index in sequence:
   if conditionMet:
       value = index
       break

try:
    doSomething(value)
except NameError:
    print "Didn't find anything"

Немного сложно сказать, действительно ли этот правильный стиль используется из такого короткого примера кода, но это более "путинский" способ работы.

EDIT: ниже комментарий JFS (размещен здесь, чтобы показать код)

Не связанный с вопросом OP, но приведенный выше код можно переписать как:

for item in sequence:
    if some_condition(item): 
       found = True
       break
else: # no break or len(sequence) == 0
    found = False

if found:
   do_something(item)

ПРИМЕЧАНИЕ: если some_condition() вызывает исключение, то found не подключается.
ПРИМЕЧАНИЕ: если len (sequence) == 0, то item не подключен.

Вышеприведенный код не рекомендуется. Его цель состоит в том, чтобы показать, как работают локальные переменные, а именно, является ли "переменная" "определена", может быть определена только во время выполнения в этом случае. Предпочтительный способ:

for item in sequence:
    if some_condition(item):
       do_something(item)
       break

Или

found = False
for item in sequence:
    if some_condition(item):
       found = True
       break

if found:
   do_something(item)

Ответ 4

Ну, если вы хотите проверить, определена ли переменная или нет, тогда почему бы не проверить, есть ли она в массивах locals() или globals()? Ваш код переписан:

for index in sequence:
   if 'value' not in globals() and conditionMet:
       value = index
       break

Если это локальная переменная, которую вы ищете, замените globals() на locals().

Ответ 5

Я обычно инициализирую переменную чем-то, что обозначает тип типа

var = ""

или

var = 0

Если это будет объект, тогда не инициализируйте его, пока вы его не создадите:

var = Var()

Ответ 6

Прежде всего, мой ответ на вопрос, который вы изначально задали

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

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

Но, кроме того, вы указали пример кода, что существуют различные перестановки, которые довольно питоничны. Вы после сканирования последовательности для элементов, соответствующих условию, вот некоторые из них:

def findFirstMatch(sequence):
    for value in sequence:
        if matchCondition(value):
            return value

    raise LookupError("Could not find match in sequence")

Очевидно, что в этом примере вы можете заменить raise на return None в зависимости от того, чего вы хотели достичь.

Если вам нужно все, что соответствует условию, вы можете это сделать:

def findAllMatches(sequence):
    matches = []
    for value in sequence:
        if matchCondition(value):
            matches.append(value)

    return matches

Есть еще один способ сделать это с помощью yield, который я не буду вам показывать, потому что он довольно сложный в том, как он работает.

Кроме того, существует один способ достижения этого:

all_matches = [value for value in sequence if matchCondition(value)]

Ответ 7

Если я правильно понимаю ваш пример, вам все равно не нужно ссылаться на "значение" в инструкции if. Вы выходите из цикла, как только он может быть настроен на что угодно.

value = None
for index in sequence:
   doSomethingHere
   if conditionMet:
       value = index
       break 

Ответ 8

Похоже, вы пытаетесь написать C в Python. Если вы хотите найти что-то в последовательности, Python имеет встроенные функции для этого, например

value = sequence.index(blarg)

Ответ 9

var_str = str()
var_int = int()

Ответ 10

Если None - допустимое значение данных, вам нужно изменить эту переменную другим способом. Вы можете использовать:

var = object()

Этот дозор предлагается Nick Coghlan.

Ответ 11

Хороший вопрос и, к сожалению, плохие ответы, поскольку var = None уже присваивает значение, и если ваш script выполняется несколько раз, он каждый раз перезаписывается None.

Это не то же самое, что определение без назначения. Я все еще пытаюсь понять, как обойти эту проблему.

Ответ 12

В Python 3.6+ вы можете использовать переменные аннотации для этого:

https://www.python.org/dev/peps/pep-0526/#abstract

PEP 484 введенные типы подсказок, аннотации типа a.k.a. В то время как основное внимание было уделено функциональным аннотациям, оно также ввело понятие комментариев типа для аннотирования переменных:

# 'captain' is a string (Note: initial value is a problem)
captain = ...  # type: str

PEP 526 нацелен на добавление синтаксиса в Python для аннотирования типов переменных (включая переменные класса и переменные экземпляра) вместо выражения через комментарии:

captain: str  # Note: no initial value!

Похоже, что это более прямо соответствует тому, что вы спрашивали: "Можно ли объявить переменную без назначения какого-либо значения в Python?"