2015-03-03 3 views
3

Поэтому я использую вложенный список, чтобы сохранить некоторые данные и у меня возникают проблемы с изменением конкретных значений одного из подсписков:Python: Изменение значения вложенного списка

if attributes[3] == 'W': 
    self.board[3][3] = 'W' 

(номера заполнители я использую для тестирования)

Совет - это переменная класса, которая создается следующим образом (я пытаюсь создать сетку, указанную пользователем, с их вводом для столбцов и рядов, составляющих первые две части от атрибутов)

self.board = [] 
rows = [] 
self.score = [0, 0] 
for x in range(attributes[0]): 
    rows.append('') 
for y in range(attributes[1]): 
    self.board.append(rows) 

Однако, когда я пытаюсь изменить значение подсписка, он изменяет значения для всех подсписков для того же индекса:

[['', '', '', 'W', '', '', '', ''], ['', '', '', 'W', '', '', '', ''], ['', '', '', 'W', '', '', '', ''], ['', '', '', 'W', '', '', '', ''], ['', '', '', 'W', '', '', '', ''], ['', '', '', 'W', '', '', '', ''], ['', '', '', 'W', '', '', '', ''], ['', '', '', 'W', '', '', '', '']] 

Я не могу понять, что случилось. У кого-нибудь есть идеи?

ответ

0

Я думаю, что причиной этого может быть продемонстрирована на этом очень простом примере:

a = [1,2,3] 

b = [a,a,a] # <- this is what you are actually doing 

print(list(map(id,b))) 
#[140475353832712, 140475353832712, 140475353832712] 

Пожалуйста, не то, что все идентификаторы же выше. Это означает, что вы находитесь в своем списке, ссылаясь на один и тот же объект. таким образом изменяя одно существо, меняет каждый подсписчик.

Однако, вы должны делать это (или некоторый эквивалент):

b2 = [a[:], a[:], a[:]] # 
print(list(map(id,b2))) 
#[140475353832136, 140475353832072, 140475353832520] 

Пожалуйста, обратите внимание, что другой идентификатор для каждого подсписка. Теперь b2 содержит ссылки на разные подсписки.

Подводя итог, вы должны иметь это:

for y in range(attributes[1]): 
    self.board.append(rows[:]) 
2

К self.board.append(rows) вы Добавляя же список в цикле. Что вам нужно приложить копию списка строк: self.board.append(rows[:])

Таким образом, измененный код будет:

self.board = [] 
rows = [] 
self.score = [0, 0] 
for x in range(attributes[0]): 
    rows.append('') 
for y in range(attributes[1]): 
    self.board.append(rows[:]) 
Смежные вопросы