Этот вопрос закрыт для ответов, так как повторяет вопрос Почему не работает так, как надо?
@PavelMos

Почему при генерировании списков как (пример) spisok=[['x']*3]*4 не работает присваивание по индексу?

Почему при генерировании списков как (пример) 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-х элементный), и при изменении одного меняются все ? Тогда зачем такой механизм нужен ?
  • Вопрос задан
  • 107 просмотров
Ответы на вопрос 1
@Everything_is_bad
Просто начни с понимания в чем различие mutable и immutable типов, и что = это оператор связывания. Обычно после такого понимания, всё дальнейшее легко раскладывается по полочкам.
Ответ написан
Ваш ответ на вопрос

Вопрос закрыт для ответов и комментариев

Потому что уже есть похожий вопрос.
Похожие вопросы