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


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

var

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

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

value

for index in sequence:

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

дублировать

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

по теме

13 191

13 ответов:

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

var = None

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

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

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

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

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

foo = None

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

редактировать: что вы действительно кажется, хотите сделать именно это:

#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"

это немного трудно сказать, если это действительно правильный стиль использовать из такого короткого примера кода, но это и более "подходящие для 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 введены подсказки типа, а также аннотации типа. Хотя его основной акцент был аннотациями функций, он также ввел понятие комментариев типа для аннотирования переменных:

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

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

captain: str  # Note: no initial value!

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

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

var = ""

или

var = 0

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

var = Var()

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

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

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

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

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

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

а далее, вы дали пример кода, что есть различные варианты, которые вполне подходящие для 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.