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

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

var

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

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

value

for index in sequence:

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

дублировать

  • Неинициализированное значение в python (тем же автором)
  • есть ли какие-либо ключевые слова объявления в В Python? (тем же автором)

по теме

  • Python: переменная область и вызовы функций
  • другие языки имеют "переменные"

13 ответов


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

var = None

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

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


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

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

Я не уверен, что вы пытаетесь сделать. 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"

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

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 (последовательность) = = 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)

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

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

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

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

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

captain: str  # Note: no initial value!

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


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

var = ""

или

var = 0

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

var = Var()

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

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

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


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

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

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

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

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)]

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

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

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

value = sequence.index(blarg)

var_str = str()
var_int = int()

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

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


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

var = object()

этот часовой предлагается Ник Когхлан.


вы можете обмануть интерпретатора с этим уродливым oneliner if None: var = None Он ничего не делает, кроме добавления переменной var в словарь локальных переменных, не инициализируя его. Интерпретатор выдаст исключение UnboundLocalError, если впоследствии вы попытаетесь использовать эту переменную в функции. Это будет работать и для очень древних версий python. Не просто, и не красиво, но не ожидайте многого от python.