Я уверен, что на это был дан ответ, но я не был уверен, как его описать.Создание подписок с использованием умножения (*) неожиданное поведение
Скажем, я хочу, чтобы создать список, содержащий 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 хранить ссылку на одну ячейку ...?
@RoadieRich Но ответы здесь содержат более подробное объяснение и ссылки на официальную документацию. –
@AseemBansal: Тогда эти ответы должны быть добавлены к * другому * вопросу, а может быть? –
Это окончательно дубликат. http://stackoverflow.com/questions/240178/unexpected-feature-in-a-python-list-of-lists и http://stackoverflow.com/questions/1605024/python-using-the-multiply-operator- to-create-copy-of-objects-in-lists и http://stackoverflow.com/questions/6688223/python-list-multiplication-3-makes-3-lists-which-mirror-each-other-when? lq = 1 и другие, которых я не могу найти сейчас. –