2016-10-25 3 views
-1

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

array = [[0, 0, 0], 
      [0, 0, 0], 
      [0, 0, 0]] 
    array[1][1] = 1 

ожидается выход:

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

однако, кажется, что значение целого столбца изменяется:

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

Почему это не работает? Как просто изменить значение записи, которую я хочу?

Спасибо!

+2

Я не могу воспроизвести это. – Barmar

+3

Вы уверены, что это ваш код? Или вы делали 'a = [0, 0, 0]' then 'array = [a, a, a]'? Это заставляет все строки ссылаться на один и тот же массив, а не на копии. – Barmar

ответ

0

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

>>> [[0]*3]*3 
[[0, 0, 0], [0, 0, 0], [0, 0, 0]] 

В этом случае все вложенный список является точечными к одной и той же ссылке на list. Обновление любого значения в списке будет отражать изменения всего списка:

>>> array = [[0]*3]*3 

>>> array[0][1] = 1 # updating 0th list 
>>> array 
[[0, 1, 0], [0, 1, 0], [0, 1, 0]] 
# ^  ^  ^all 1 indexes updated 

>>> array[1][0] = 2 # updating 1st list 
>>> array 
[[2, 1, 0], [2, 1, 0], [2, 1, 0]] 
#^  ^  ^ all 0 indexes updated 

Для того, чтобы исправить это, создать свой array как:

>>> [[0]*3 for _ in range(3)] 
[[0, 0, 0], [0, 0, 0], [0, 0, 0]] 

На выполнение такой же набор операций в этом списке, я получаю :

>>> array = [[0]*3 for _ in range(3)] 

>>> array[0][1] = 1 
>>> array 
[[0, 1, 0], [0, 0, 0], [0, 0, 0]] 
# ^ Only one value updated as expected 

>>> array[1][0] = 2 
>>> array 
[[0, 1, 0], [2, 0, 0], [0, 0, 0]] 
#   ^again as expected  
+0

Да, это то, что я сделал, большое вам спасибо! Я не знал, что существует разница между различными методами объявления массивов. –

+0

@DawnChen: Если это помогло, тогда отметьте его как принятое (нажмите кнопку галочки слева от ответа). Принятые ответы действуют как ссылка для других, которые ищут решение той же проблемы в будущем –

0

Когда я это делаю, получаю ожидаемый результат.

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

array = [[0, 0, 0]] * 3 

То, что здесь происходит, вы создаете 1 массив строк, [0, 0, 0] и настройки массива [0] = Array [1] = array [2] = [0, 0, 0]. Поскольку все они указывают на одну строку, если вы измените одно значение в этой строке, это изменение будет видимым во всех трех строках.

Если инициализировать массив со списком понимания, вы создаете новую строку каждый раз, и вы получите ожидаемый результат:

array = [[0, 0, 0] for i in range(3)] 
Смежные вопросы