Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
0 / 0 / 0
Регистрация: 20.04.2015
Сообщений: 3

Изменение значения вложенного словаря

24.03.2020, 23:22. Показов 4576. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
При изменении значения во вложенном словаре plita['ЛДСП 16 БЕЗ ТЕКСТУРЫ']['total']='5',
значение изменяется и в plita['ЛДСП 8 БЕЗ ТЕКСТУРЫ']['total']:

{'ЛДСП 16 БЕЗ ТЕКСТУРЫ': {'length': '0', 'cost': '0', 'total': 5}, 'ЛДСП 8 БЕЗ ТЕКСТУРЫ': {'length': '0', 'cost': '0', 'total': 5}}

Python
1
2
3
4
5
6
raspil=[['1', 'ЛДСП 16 БЕЗ ТЕКСТУРЫ', '2715', '549', '2', '2Х19ММ', '', '', ''], ['2', 'ЛДСП 16 БЕЗ ТЕКСТУРЫ', '2715', '143', '2', '2Х19ММ', '', '', ''], ['3', 'ЛДСП 16 БЕЗ ТЕКСТУРЫ', '691', '549', '2', '2Х19ММ', '', '', ''], ['4', 'ЛДСП 16 БЕЗ ТЕКСТУРЫ', '707', '549', '3', '2Х19ММ', '', '', ''], ['5', 'ЛДСП 16 БЕЗ ТЕКСТУРЫ', '549', '366', '1', '', '', '2Х19ММ', ''], ['6', 'ЛДСП 16 БЕЗ ТЕКСТУРЫ', '549', '49', '7', '2Х19ММ', '', '2Х19ММ', ''], ['7', 'ЛДСП 16 БЕЗ ТЕКСТУРЫ', '549', '433', '1', '', '', '2Х19ММ', ''], ['8', 'ЛДСП 16 БЕЗ ТЕКСТУРЫ', '1398', '143', '2', '2Х19ММ', '', '', ''], ['9', 'ЛДСП 16 БЕЗ ТЕКСТУРЫ', '1434', '149', '1', '2Х19ММ', '', '', ''], ['10', 'ЛДСП 16 БЕЗ ТЕКСТУРЫ', '691', '149', '2', '2Х19ММ', '', '', ''], ['11', 'ЛДСП 16 БЕЗ ТЕКСТУРЫ', '450', '633', '3', '', '', '', ''], ['12', 'ЛДСП 16 БЕЗ ТЕКСТУРЫ', '480', '198', '6', '2Х19ММ', '2Х19ММ', '2Х19ММ', '2Х19ММ'], ['13', 'ЛДСП 16 БЕЗ ТЕКСТУРЫ', '631', '198', '6', '2Х19ММ', '2Х19ММ', '2Х19ММ', '2Х19ММ'], ['1', 'ЛДСП 16 БЕЗ ТЕКСТУРЫ', '749', '399', '1', '2Х19ММ', '', '2Х19ММ', ''], ['2', 'ЛДСП 16 БЕЗ ТЕКСТУРЫ', '1066', '399', '1', '2Х19ММ', '', '2Х19ММ', ''], ['3', 'ЛДСП 16 БЕЗ ТЕКСТУРЫ', '1883', '399', '1', '2Х19ММ', '', '', ''], ['4', 'ЛДСП 16 БЕЗ ТЕКСТУРЫ', '2349', '499', '2', '2Х19ММ', '', '', ''], ['1', 'ЛДСП 8 БЕЗ ТЕКСТУРЫ', '665', '2600', '2', '', '', '', ''], ['2', 'ЛДСП 8 БЕЗ ТЕКСТУРЫ', '1966', '151', '1', '0.4Х19ММ', '0.4Х19ММ', '0.4Х19ММ', '0.4Х19ММ'], ['3', 'ЛДСП 8 БЕЗ ТЕКСТУРЫ', '2518.5', '150.5', '1', '0.4Х19ММ', '', '0.4Х19ММ', ''], ['4', 'ЛДСП 8 БЕЗ ТЕКСТУРЫ', '2500', '938', '1', '', '', '', '']]
plita = {}
parametr_plita={'length': '0', 'cost': '0', 'total': '0'}
for i in raspil:
    plita.setdefault(i[1],parametr_plita)
plita['ЛДСП 16 БЕЗ ТЕКСТУРЫ']['total']='5'
Если задаю словарь в явном виде, то все работает как надо, т.е :

Python
1
2
plita={'ЛДСП 16 БЕЗ ТЕКСТУРЫ': {'length': '0', 'cost': '0', 'total': '0'}, 'ЛДСП 8 БЕЗ ТЕКСТУРЫ': {'length': '0', 'cost': '0', 'total': '0'}}
plita['ЛДСП 16 БЕЗ ТЕКСТУРЫ']['total']=5
{'ЛДСП 16 БЕЗ ТЕКСТУРЫ': {'length': '0', 'cost': '0', 'total': 5},
'ЛДСП 8 БЕЗ ТЕКСТУРЫ': {'length': '0', 'cost': '0', 'total': '0'}}

Подскажите, пожалуйста, в чем проблема.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.03.2020, 23:22
Ответы с готовыми решениями:

Как получить значение из вложенного словаря
Добрый день, подскажите, пожалуйста, как получить значение по ключу из вложенного словаря? Например, как обратиться к E-2 -> V_app, что...

Python - найти список значений ключей словаря вложенного в списки
Добрый день уважаемые форумчане. Вопрос такой: Есть список - d, и список ключей l: d = , , , ] l =

Как проверить наличие значения словаря словаря в словаре словарей?
есть массив parsdata, который содержит результаты парсинга. нужно проверить, спарсилось ли что-то новое. или нет в сравнении со словарем...

3
Эксперт Python
 Аватар для unfindable_404
693 / 471 / 204
Регистрация: 22.03.2020
Сообщений: 1,051
25.03.2020, 01:02
Суть в том, что словари изменяемые, а следовательно при присвоении в переменную вы присваиваете ссылку на объект.
То есть в первом случае все ключи словаря plita ссылаются на один и тот же словарь parametr_plita.
Python
1
2
3
4
5
raspil=[['1', 'ЛДСП 16 БЕЗ ТЕКСТУРЫ', '2715', '549', '2', '2Х19ММ', '', '', ''], ['2', 'ЛДСП 16 БЕЗ ТЕКСТУРЫ', '2715', '143', '2', '2Х19ММ', '', '', ''], ['3', 'ЛДСП 16 БЕЗ ТЕКСТУРЫ', '691', '549', '2', '2Х19ММ', '', '', ''], ['4', 'ЛДСП 16 БЕЗ ТЕКСТУРЫ', '707', '549', '3', '2Х19ММ', '', '', ''], ['5', 'ЛДСП 16 БЕЗ ТЕКСТУРЫ', '549', '366', '1', '', '', '2Х19ММ', ''], ['6', 'ЛДСП 16 БЕЗ ТЕКСТУРЫ', '549', '49', '7', '2Х19ММ', '', '2Х19ММ', ''], ['7', 'ЛДСП 16 БЕЗ ТЕКСТУРЫ', '549', '433', '1', '', '', '2Х19ММ', ''], ['8', 'ЛДСП 16 БЕЗ ТЕКСТУРЫ', '1398', '143', '2', '2Х19ММ', '', '', ''], ['9', 'ЛДСП 16 БЕЗ ТЕКСТУРЫ', '1434', '149', '1', '2Х19ММ', '', '', ''], ['10', 'ЛДСП 16 БЕЗ ТЕКСТУРЫ', '691', '149', '2', '2Х19ММ', '', '', ''], ['11', 'ЛДСП 16 БЕЗ ТЕКСТУРЫ', '450', '633', '3', '', '', '', ''], ['12', 'ЛДСП 16 БЕЗ ТЕКСТУРЫ', '480', '198', '6', '2Х19ММ', '2Х19ММ', '2Х19ММ', '2Х19ММ'], ['13', 'ЛДСП 16 БЕЗ ТЕКСТУРЫ', '631', '198', '6', '2Х19ММ', '2Х19ММ', '2Х19ММ', '2Х19ММ'], ['1', 'ЛДСП 16 БЕЗ ТЕКСТУРЫ', '749', '399', '1', '2Х19ММ', '', '2Х19ММ', ''], ['2', 'ЛДСП 16 БЕЗ ТЕКСТУРЫ', '1066', '399', '1', '2Х19ММ', '', '2Х19ММ', ''], ['3', 'ЛДСП 16 БЕЗ ТЕКСТУРЫ', '1883', '399', '1', '2Х19ММ', '', '', ''], ['4', 'ЛДСП 16 БЕЗ ТЕКСТУРЫ', '2349', '499', '2', '2Х19ММ', '', '', ''], ['1', 'ЛДСП 8 БЕЗ ТЕКСТУРЫ', '665', '2600', '2', '', '', '', ''], ['2', 'ЛДСП 8 БЕЗ ТЕКСТУРЫ', '1966', '151', '1', '0.4Х19ММ', '0.4Х19ММ', '0.4Х19ММ', '0.4Х19ММ'], ['3', 'ЛДСП 8 БЕЗ ТЕКСТУРЫ', '2518.5', '150.5', '1', '0.4Х19ММ', '', '0.4Х19ММ', ''], ['4', 'ЛДСП 8 БЕЗ ТЕКСТУРЫ', '2500', '938', '1', '', '', '', '']]
plita = {}
for i in raspil:
    plita.setdefault(i[1], {'length': '0', 'cost': '0', 'total': '0'})
plita['ЛДСП 16 БЕЗ ТЕКСТУРЫ']['total']='5'
Это решит проблему
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
25.03.2020, 01:26
vek8, Это связано с особенностью переменных в питоне. Переменная parametr_plita содержит ссылку на изменяемый объект-словарь, который является областью в оперативной памяти. Когда Вы в словарь plita ключам 'ЛДСП 16 БЕЗ ТЕКСТУРЫ' и 'ЛДСП 8 БЕЗ ТЕКСТУРЫ' присваиваете значение из переменной parametr_plita , В фактически присваиваете этим ключам один и тот же изменяемый объект размещенный в оперативной памяти. Поэтому, когда Вы изменяете этот объект в одном ключе, он изменяется и в другом ключе, так как это один и тот же объект. Когда Вы создаете словарь в ручную, то там значения ключей, это разные объекты, хотя выглядят и одинаково.
Решить проблему можно, если Вы в цикле будете добавлять элементы в словарь беря в качестве значений не словарь из переменной parametr_plita , а его копию. Используйте
Python
1
dict.copy() -> dict Поверхностная копия словаря
В Вашем случае поверхностной копии будет достаточно, так как в словаре parametr_plita={'length': '0', 'cost': '0', 'total': '0'} вложений нет.

Добавлено через 1 минуту
Сорри, пока я писал, Вам уже дали правильный ответ.

Добавлено через 6 минут
unfindable_404, Вполне вероятно, что переменной parametr_plita могут присваиваться разные словари. Поэтому для универсальности лучше делать копию словаря, при которой создается новый словарь аналогичный исходному.
1
0 / 0 / 0
Регистрация: 20.04.2015
Сообщений: 3
25.03.2020, 10:00  [ТС]
Спасибо, все понятно!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.03.2020, 10:00
Помогаю со студенческими работами здесь

Восстановление значения ключей словаря
Восстановить значение ключей словаря, если значение переменной s1 равно апельсин, а значение переменной s2 равно спаниель. dct = {...:...

Как перемножить значения словаря!?
Доброе! Дан словарь,и значение разных цифр-чисел.надо числа-цифры перемножить и вывести y={'Marlboro':} Типа так словарь,с числами!...

Группировать значения словаря по ключам
Доброго времени суток! Помогите в следующем вопросе. Есть словарь: а = {United States: 129.203.29.198, Switzerland: 148.187.4.164,...

Словарь, просуммировать значения словаря по категорями
Всем доброго! Имеется вот такая импровизированная "база данных" expenses = Как можно просуммировать "amount"...

PySimpleGUI sg.Radio получение значения из словаря
Всем привет. Не давно сделал консольную утилиту с запуском по параметрам и решил сделать для нее графическую версию с возможностью запуска...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru