Я уверен, что на это был дан ответ, но я не был уверен, как его описать.
Скажем, я хочу создать список, содержащий 3 пустых списка, например:
lst = [[], [], []]
Я думал, что все умнее, делая это:
lst = [[]] * 3
Но я обнаружил, что после отладки какого-то странного поведения это вызвало обновление одного из подписок, например lst[0].append(3)
, для обновления всего списка, сделав его [[3], [3], [3]]
, а не [[3], [], []]
.
Однако, если я инициализирую список с помощью
lst = [[] for i in range(3)]
тогда выполнение lst[1].append(5)
дает ожидаемый [[], [5], []]
Мой вопрос , почему это происходит? Интересно отметить, что если я делаю
lst = [[]]*3
lst[0] = [5]
lst[0].append(3)
тогда "связь" ячейки 0 сломается, и я получаю [[5,3],[],[]]
, но lst[1].append(0)
все еще вызывает [[5,3],[0],[0]
.
Мое лучшее предположение заключается в том, что использование умножения в форме [[]]*x
заставляет Python хранить ссылку на одну ячейку...?