Почему при генерировании списков как (пример) spisok=[['x']*3]*4 не работает присваивание по индексу ?
Допустим, мне нужно создать список нужного размера, заполненный чем-то по умолчанию.
lenght=3
height=4
Я делаю spisok=[['x]*height]*lenght (пусть будет список из столбцов, а не строк), получаю список.
Но когда начинаю менять элементы по индексу spisok[1][2]='y', то значение ячейки меняется во всех вложенных списках. То есть получается
lenght=3
height=4
spisok1=[['x']*3]*4
spisok1
[['x', 'x', 'x'], ['x', 'x', 'x'], ['x', 'x', 'x'], ['x', 'x', 'x']]
spisok1[1][2]='y'
spisok1
[['x', 'x', 'y'], ['x', 'x', 'y'], ['x', 'x', 'y'], ['x', 'x', 'y']]
Если же создавать через генератор списков, то всё ок.
spisok2=[ ['x']*lenght for x in range (0,height)]
spisok2
[['x', 'x', 'x'], ['x', 'x', 'x'], ['x', 'x', 'x'], ['x', 'x', 'x']]
spisok2[1][2]='y'
spisok2
[['x', 'x', 'x'], ['x', 'x', 'y'], ['x', 'x', 'x'], ['x', 'x', 'x']]
Что происходит со структурой данных при создании первым способом ? Это из-за того, что выражением умножить создаются копии одного и того же списка (который 4-х элементный), и при изменении одного меняются все ? Тогда зачем такой механизм нужен ?