2016-12-13 5 views
0

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

p1=(20,50) 
p2=(70,80) 
p3=(100,140) 
listP=[] 
#listP=[p1,p2,p3] #manually it works 
for i in range(3): 
    listP.append('p'+str(i)) 

Результат должен быть список точки, вместо (p1, p2 и т.д.) Заранее большое спасибо!

+4

Почему вы не определили их в виде списка, а не независимо друг от друга названных переменных в первую очередь? – TigerhawkT3

+0

* вручную он работает * - как вы писали, ручное действие может стать решением. Покажите, как должно выглядеть окончательное содержимое списка. – RomanPerekhrest

ответ

1

В вашем примере, p1, p2, p3являются идентификаторы, но в вашем for -loop, добавьте имена этих идентификаторов в качестве строки в свой список. Следовательно, вы получаете список строк, а не список разыменованных значений для идентификаторов, соответствующих этим строкам. Это необходимо и желательно.

Идентификаторы - это именованные дескрипторы, используемые в вашем коде для доступа к значениям, которые они ссылаются. В общем, ни один язык программирования не автоматически преобразует строки, которые могут соответствовать некоторым локальным идентификаторам, в фактические ссылки, поскольку в большинстве случаев это непреднамеренное поведение. Подумайте о масштабах и безопасности.

Обычно вы не должны пытаться преобразовывать строки в идентификаторы. В python вы можете сделать это, используя getattr. Однако я не буду обрисовывать это здесь, потому что, опять же, вы не должны делать этого.

подход лучше для вашего случая, чтобы непосредственно инстанцирует очки в list или dict структуры:

# List: 
plist = [(20, 50), (70, 80), (100, 140)] 

# Dict: 
pdict = { 
    'p1': (20, 50), 
    'p2': (70, 80), 
    'p3': (100, 140) 
} 

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

# For list case: 
for i in range(3): 
    print(plist[i]) 

# For dict case: 
for i in range(3): 
    print(pdict['p{:d}'.format(i)]) 
+0

Согласен с тем, что использование словарей кажется правильным. Но иногда также полезно знать, как динамически обращаться к именам переменных. –

+0

Создание имен переменных в виде строк и разыменование их динамически - плохое кодирование почти на всех уровнях. Действительно, приятно знать, но обычно это указывает на главный недостаток дизайна, если вам нужно это сделать. Как насчет отладки, рефакторинга, инспекции (чтобы назвать только несколько)? – jbndlr

+0

Очень согласовано, требуется изменение дизайна/алгоритма в программе. –

1

Если Вы хотите получить доступ к переменным, используя их имена в виде строк. Вы можете использовать locals() или vars() (спасибо @Wingston Sharon для этого):

# Using locals() 
for i in range(3): 
    listP.append(locals()['p' + str(i)]) 

# Using vars() 
for i in range(3): 
    listP.append(vars()['p' + str(i)]) 
+1

Это решение Y для задачи X (см. [Проблема XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)) и очень хакерское решение. – TigerhawkT3

1

вы можете использовать vars()

for i in range(1,4): 
    listP.append(vars()['p'+str(i)]) 
+0

Ницца, я пропустил 'vars()'. – Fejs

+1

Это решение Y для задачи X (см. [Проблема XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)) и очень хакерское решение. – TigerhawkT3

Смежные вопросы