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

Вы можете выполнить транспонирование , за которым следует свопакс :

import numpy as np

movies = np.zeros((10, 250, 100))

print(movies.shape)
print(np.swapaxes(movies.T, 0, 1).shape)

Выход

(10, 250, 100)
(250, 100, 10)

258
задан Community 23 May 2017 в 02:10
поделиться

9 ответов

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

var = None

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

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

326
ответ дан Todd Gamblin 23 November 2019 в 02:41
поделиться

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

val = None
# ...
if val is None:
   val = any_object
54
ответ дан meetar 23 November 2019 в 02:41
поделиться

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

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

РЕДАКТИРОВАНИЕ: ниже комментарий 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)
13
ответ дан jfs 23 November 2019 в 02:41
поделиться

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

var = ""

или

var = 0

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

var = Var()
3
ответ дан Andrew Hare 23 November 2019 в 02:41
поделиться

В первую очередь, мой ответ на вопрос Вы первоначально спросили

Q: Как я обнаруживаю, определяется ли переменная в точке в моем коде?

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

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

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)]
2
ответ дан Jerub 23 November 2019 в 02:41
поделиться

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

value = None
for index in sequence:
   doSomethingHere
   if conditionMet:
       value = index
       break 
2
ответ дан Peter 23 November 2019 в 02:41
поделиться

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

value = sequence.index(blarg)
1
ответ дан 23 November 2019 в 02:41
поделиться

Это возможный объявить переменную в Python (var=None):

def decl_var(var=None):
if var is None:
    var = []
var.append(1)
return var
0
ответ дан 23 November 2019 в 02:41
поделиться

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

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

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

3
ответ дан 23 November 2019 в 02:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: