2015-10-11 3 views
0

У меня возникла проблема, которую я не могу решить самостоятельно. Его о следующем фрагменте:Добавить список в список в Python

counter = 0 
appendList = [] 
valueList = [[0], [0]] 

for i in range(0,3): 

    valueList[1] = counter 
    print "Loop " , i , " valueList: " , valueList 
    print "Appending (valueList): " , valueList , " to (appendList): " , appendList 
    appendList.append(valueList) 
    counter = counter + 1 


print "Final appendList: " , appendList 

Это приводит следующий вывод:

Loop 0 valueList: [[0], 0] 
Appending (valueList): [[0], 0] to (appendList): [] 
Loop 1 valueList: [[0], 1] 
Appending (valueList): [[0], 1] to (appendList): [[[0], 1]] 
Loop 2 valueList: [[0], 2] 
Appending (valueList): [[0], 2] to (appendList): [[[0], 2], [[0], 2]] 
Final appendList: [[[0], 2], [[0], 2], [[0], 2]] 

Я хотел сниппета, чтобы добавить другую List-Items к appendList. Окончательный результат должен был выглядеть так:

[[[0], 0], [[0], 1], [[0], 2]] 

Но как вы можете видеть, фрагмент кода заполняет appendList с теми же значениями самого высокого прилавка.

Может кто-нибудь, пожалуйста, объясните мне это поведение или скажите мне, где моя ошибка?

+0

Назначьте копию каждый раз, как этот 'appendList.append (valueList [:])' – thefourtheye

+0

Спасибо, что решил мою проблему. Можете ли вы объяснить, почему? – user2058521

+0

Написание ответа на это прямо сейчас. – ppperry

ответ

2

valueList - это тот же объект каждый раз, когда вы его добавляете, поэтому его изменение в одном месте, по-видимому, изменяет его повсюду.

>>> a = [0] 
>>> b = a 
>>> a[0] = 42 
>>> b 
[42] 

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

appendList.append(valueList[:]) 
1

Вы можете попробовать:

counter = 0 
appendList = [] 
valueList = [[0], [0]] 

for i in range(0,3): 

    valueList[1] = counter 
    print "Loop " , i , " valueList: " , valueList 
    print "Appending (valueList): " , valueList , " to (appendList): " , appendList 
    appendList.append(valueList[:]) 
    counter = counter + 1 


print "Final appendList: " , appendList 

Выход:

Loop 0 valueList: [[0], 0] 
Appending (valueList): [[0], 0] to (appendList): [] 
Loop 1 valueList: [[0], 1] 
Appending (valueList): [[0], 1] to (appendList): [[[0], 0]] 
Loop 2 valueList: [[0], 2] 
Appending (valueList): [[0], 2] to (appendList): [[[0], 0], [[0], 1]] 
Final appendList: [[[0], 0], [[0], 1], [[0], 2]] 

Объяснение:

При назначении valuelist объекта, все элементы назначения от объекта Referance. Итак, вместо b = a, вы можете сделать b = a [:], потому что он только копирует каждый раз с этого объекта.

>>> a = [1, 2, 3] 
>>> b = a 
>>> a[:] = [4, 5, 6] 
>>> b 
[4, 5, 6] 
>>> a 
[4, 5, 6] 
>>> b = a [:] 
>>> a = [1, 2, 3] 
>>> b 
[4, 5, 6] 
>>> a 
[1, 2, 3] 
>>> 
+0

Хотя он решает проблему, это не объясняет, почему и является точной копией комментария @ thefourtheye. – ppperry

+0

Ок только подождите. Я пишу объяснение –

+0

@ppperry: Теперь это нормально? –

0

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

0

valueList все еще указывает на один объект. Вы можете проверить это, распечатав id(valueList). id дает идентификатор объекта. т.е. адрес памяти объекта. В вашем примере, если вы напечатаете идентификатор, он будет всегда таким же.

counter = 0 
appendList = [] 
valueList = [[0], [0]] 

for i in range(0,3): 
    print "id of valueList before", id(valueList) 
    #creates a copy of valueList. 
    valueList = valueList[:] 
    print "id of valueList after", id(valueList) 
    valueList[1] = counter 
    print "Loop " , i , " valueList: " , valueList 
    print "Appending (valueList): " , valueList , " to (appendList): ", appendList 
    appendList.append(valueList) 
    counter = counter + 1 


print "Final appendList: " , appendList 
0
counter = 0 
appendList = [] 
valueList = [[0], [0]] 

print(valueList[1][0]) 

for i in range(0,3): 

    print(counter) 
    valueList[1][0] = counter # this was wrong 
    print ("Loop " , i , " valueList: " , valueList) 
    print ("Appending (valueList): " , valueList , " to (appendList): " , appendList) 
    appendList.append(valueList) 
    valueList = [[0], [0]] # and this was absent 
    counter += 1 

print(appendList) 

[[[0], [0]], [[0], [1]], [[0], [2]]] 
0

Хорошая привычка также проверить эффективность вашего кода после: вы определяете несколько переменных, а (для меня) вы заинтересованы в appendList.

appendList = [ [[0], x] for x in range(3) ] # doStuff for index in range of n print appendList С списка понимания вы можете уменьшить его только необходимое вычисления.

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