Индексация в списке словарей влияет на все словари

Я составил список словарей, как показано ниже.

num=5
core_dict ={'c1':[0]*num , 'c2':[0]*num}
link=[core_dict]*3

это дает (правильный) вывод:

[ {'c1': [0, 0, 0, 0, 0], 'c2': [0, 0, 0, 0, 0]},  #represents link1 for me
  {'c1': [0, 0, 0, 0, 0], 'c2': [0, 0, 0, 0, 0]},  #represents link2 for me
  {'c1': [0, 0, 0, 0, 0], 'c2': [0, 0, 0, 0, 0]}]  #represents link3 for me

Затем я хочу заменить значения 'c1' link2. Я делаю:

link[1]['c1']=[10]*num

но это изменяет значения клавиши 'c1' для каждого словаря в списке. Как я могу индексировать только один словарь?

[ {'c1': [10, 10, 10, 10, 10], 'c2': [0, 0, 0, 0, 0]},  #represents link1 for me
  {'c1': [10, 10, 10, 10, 10], 'c2': [0, 0, 0, 0, 0]},  #represents link2 for me
  {'c1': [10, 10, 10, 10, 10], 'c2': [0, 0, 0, 0, 0]}]  #represents link3 for me
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
0
30
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Ваша инициализация link указывает каждый элемент на один и тот же словарь (т.е. на одно и то же место в памяти):

Вместо использования:

link=[core_dict]*3

использовать

from copy import deepcopy
link=[deepcopy(core_dict) for _ in range(3)]

так что память, используемая каждым словарем, полностью отделена.

Хотел бы я проголосовать за это несколько раз! Я боролся с этим так много часов. Во-первых, не зная, где в моем большом коде происходит эта ошибка, а затем не зная, почему это происходит, когда логически индексирование выглядело для меня нормально. Но вы имеете в виду, что если у меня не было этой строки link, то был ли мой способ индексации правильным?

knowledge_seeker 09.04.2022 04:13

Это зависит от того, каково значение link_core_slots, которого нет в вашем исходном вопросе. (Пока вы здесь, не забудьте примите ответ, который вы считаете наиболее полезным.)

BrokenBenchmark 09.04.2022 04:34

Хорошо, я понимаю. Извините, это link в обоих местах, а не link один раз, а затем link_core_slots. Я отредактировал это сейчас. Я принял ваши ответы. Я проголосовал и поспешно пошел исправлять свой код. Мои сотни строк кода теперь работают!.

knowledge_seeker 09.04.2022 04:40

Если они одинаковые, то индексация должна быть в порядке.

BrokenBenchmark 09.04.2022 04:40

Вы также можете создать link вот так, не импортируя deepcopy:

link=[core_dict.copy() for i in range(3)]

это тоже работает.

knowledge_seeker 09.04.2022 04:17

Это не сработает, если вам когда-нибудь понадобится вызвать .append() или расширить любой из списков в словаре, потому что память для этих списков остается общей, если вы не используете deepcopy.

BrokenBenchmark 09.04.2022 04:22

@BrokenBenchmark хорошо, я не знал об этих возможных последствиях.

knowledge_seeker 09.04.2022 04:45

Другие вопросы по теме