Python установка значений для ключей во вложенных словарях, когда ключи совпадают - PullRequest
0 голосов
/ 08 июля 2020

Действительно простая ситуация, но я нигде не могу найти ответ. У меня есть словарь, содержащий множество других словарей, которые я использую для хранения конфигураций. Каждый вложенный словарь создается на основе одного шаблона, поэтому ключи одинаковы. При попытке установить ключ в одном из них один и тот же ключ во всех вложенных словарях обновляется со значением.

Вот пример того, что я делаю.

my_dict = {
    "bar": {
        "baz": None,
        "qux": None
    },
    "foo": {
        "baz": None,
        "qux": None
    }
}

my_dict['foo']['baz'] = True

Значит, словарь так выглядит, не понимаю почему? Я уверен, что и раньше делал подобные вещи нормально, поэтому это сбивает с толку.

{
    "bar": {
        "baz": True,
        "qux": None
    },
    "foo": {
        "baz": True,
        "qux": None
    }
}

EDIT

Вложенные словари создаются с использованием такого шаблона:

temp = {'baz': None,
        'qux': None}
 
my_dict['foo'] = temp
my_dict['bar'] = temp

Любая помощь будет принята с благодарностью, спасибо

Ответы [ 2 ]

0 голосов
/ 08 июля 2020

Проблема возникает из-за того, что вы указываете my_dict['foo'] и my_dict['bar'] на один и тот же объект. Итак, как только этот объект будет изменен, значение для обоих будет изменено.

Помимо того, что есть у Энн, вы можете попробовать использовать это, поскольку ваш словарь неглубокий:

my_dict = {}

temp = {'baz': None,
        'qux': None}
 
my_dict['foo'] = dict(temp)
my_dict['bar'] = dict(temp)

print(my_dict)
my_dict['foo']['baz'] = True
print(my_dict)

dict создает новый объект словаря.

0 голосов
/ 08 июля 2020

Вам необходимо использовать метод copy, чтобы скопировать тип dict без их связи друг с другом:

my_dict = {}

temp = {'baz': None,
        'qux': None}
 
my_dict['foo'] = temp.copy()
my_dict['bar'] = temp.copy()

print(my_dict)
my_dict['foo']['baz'] = True
print(my_dict)

Вывод:

{'bar': {'baz': None, 'qux': None},
 'foo': {'baz': None, 'qux': None}}

{'bar': {'baz': None, 'qux': None},
 'foo': {'baz': True, 'qux': None}}

Примечание. В этом случае вам не нужно дважды вызывать .copy(), потому что вы не используете temp где-либо еще в своем коде. Таким образом, изменение содержимого - это нормально, если у вас есть другой диктатор, который использует .copy().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...