Изменение определенного элемента в двумерном списке в python

У меня есть следующий код:

a=[[0]*2]*3 print a a[1][1]=2 print a 

выход:

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

Почему он меняет все элементы списка?

Не должно быть выхода:

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

Что нужно сделать, если я просто хочу изменить один из элементов?

Спасибо за помощь!

3 Solutions collect form web for “Изменение определенного элемента в двумерном списке в python”

Когда вы делаете [0] * 2 , это приводит к списку [0, 0] . Когда вы умножаете это на 3, вы создаете список с тремя ссылками на этот список. Вероятно, вы захотите сделать это:

 a = [[0] * 2 for _ in range(3)] 

Я видел эту проблему много раз, и это расстраивает.

Когда вы это сделаете:

 a = [[0] * 2] * 3 

Вы создаете список [0, 0] и передаете его трижды, чтобы сформировать a . Эти клонированные списки – это просто ссылки на исходный объект списка. Когда вы меняете один, вы изменяете оригинал, а все остальные также модифицируются.

Решение довольно просто:

 a = [[0 for j in range(2)] for i in range(3)] 

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

Почему он меняет все элементы списка?

Потому что они все те же элементы.

Что нужно сделать, если я просто хочу изменить один из элементов?

Вам нужно составить список, содержащий три разных экземпляра [0, 0] .

Умножение списка делает список, который ссылается на одни и те же вещи несколько раз.

Попробуйте, например, [[0] * 2 for _ in range(3)] .

Причина, по которой нет проблемы с [0] * 2 состоит в том, что тот факт, что оба элемента являются «одинаковыми 0 », не имеет значения; 0 равно 0 и не может быть изменено. Запись a[0][0] = 1 заменяет 0, но модифицирует [0, 0] содержащую это 0 (в силу замены 0 ).

Python - лучший язык программирования в мире.