Можно ли только объявить переменную без присвоения какого-либо значения в 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 является динамическим, поэтому вам не нужно объявлять вещи; они существуют автоматически в первой области, где они назначены. Итак, все, что вам нужно, это обычный старый оператор присваивания, как указано выше.
это хорошо, потому что вы никогда не будете в конечном итоге с неинициализированной переменной. Но будьте осторожны-это не значит, что вы не будете в конечном итоге с неправильно инициализированные переменные. Если вы инит что-то
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 = None
уже присваивает значение, и если ваш скрипт выполняется несколько раз, он перезаписывается сNone
каждый раз.это не то же самое как определение без назначения. Я все еще пытаюсь выяснить, как обойти эту проблему.
Если
None
является допустимым значением данных, то вам нужно переменную другим способом. Вы могли бы использовать:var = object()
этот страж предлагается Ник Когхлан.
вы можете обмануть интерпретатора с этой уродливой oneliner
if None: var = None
Он ничего не делает, кроме добавления переменнойvar
в словарь локальных переменных, не инициализируя его. Интерпретатор выдаст исключение UnboundLocalError, если вы попытаетесь использовать эту переменную в функции после этого. Это будет работать и для очень древних версий python. Не простой, ни красивый, но не ожидайте многого от python.