«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Почему списки связаны друг с другом при использовании [[]] * n при инициализации списков Python?

Почему списки связаны друг с другом при использовании [[]] * n при инициализации списков Python?

Опубликовано 5 ноября 2024 г.
Просматривать:521

Why Do Lists Linked Together When Using [[]] * n in Python List Initialization?

Проблема связывания списков при инициализации списка с помощью [[]] * n

При инициализации списка списков с использованием [[]] n программисты часто сталкиваются с неожиданной проблемой, когда списки кажутся связанными друг с другом. Это происходит потому, что синтаксис [x]n создает несколько ссылок на один и тот же базовый объект списка, а не создает отдельные экземпляры списка.

Чтобы проиллюстрировать проблему, рассмотрим следующий код:

x = [[]] * 3
x[1].append(0)
print(x)

Вывод этого кода:

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

Вместо ожидаемого вывода:

[[], [0], []]

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

Чтобы создать список действительно различных списков, правильный подход — использовать понимание списка:

x = [[] for i in range(3)]

Этот синтаксис создает новый объект списка для каждого элемента в списке, гарантируя, что они независимы.

Следующий код служит демонстрацией:

In [20]: x = [[]] * 4

In [21]: [id(i) for i in x]
Out[21]: [164363948, 164363948, 164363948, 164363948] # same id()'s for each list,i.e same object


In [22]: x=[[] for i in range(4)]

In [23]: [id(i) for i in x]
Out[23]: [164382060, 164364140, 164363628, 164381292] #different id(), i.e unique objects this time
Заявление о выпуске Эта статья перепечатана по адресу: 1729212379. В случае каких-либо нарушений, пожалуйста, свяжитесь с [email protected], чтобы удалить ее.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3