Отслеживание ограничений для раскраски графа?

Я работаю над проблемой раскраски графа. Прямо сейчас я застрял на шаге, который должен быть очень простым. Я создал словарь, который включает все возможные цвета для каждого узла (разные цвета представлены целыми числами 0, 1, 2, 3). Смотри ниже. (Заранее извиняюсь, если форматирование вопроса не получается правильно. Я впервые задаю вопрос здесь).

        node_count = 4
        colors = [0,1,2,3]

        sol_dict = {node:colors for node in range(0,node_count)}

        print(sol_dict)

Выход:

        {0: [0, 1, 2, 3], 1: [0, 1, 2, 3], 2: [0, 1, 2, 3], 3: [0, 1, 2, 3]}

Все, что я хочу сделать, это удалить элементы из некоторых из этих списков, когда я применяю ограничение. Например, если мой алгоритм обнаруживает, что узел 1 в словаре не может принимать значение цвета 0, я хочу удалить 0 из списка, связанного с ключом словаря 1. Для этого я пишу:

        sol_dict[1].remove(0)

        print(sol_dict)

Выход:

        {0: [1, 2, 3], 1: [1, 2, 3], 2: [1, 2, 3], 3: [1, 2, 3]}

Как видите, это удаляет 0 из всех элементов словаря. Я в недоумении, почему это происходит. Дайте мне знать, что вы думаете. Я застрял на этом некоторое время.


person lcleary    schedule 07.01.2021    source источник
comment
Если вы берете один и тот же colors каждый раз, вы получаете 4 ссылки на один и тот же объект colors. sol_dict = {node:colors.copy() for node in range(0,node_count)} создает новый объект для каждой из ваших записей в словаре.   -  person Finn    schedule 07.01.2021
comment
Это объясняет это для переменных. Это полная история, если вам интересно   -  person Finn    schedule 07.01.2021
comment
Я понимаю. Я предполагал, что после создания словаря он будет каждый раз создавать новый объект. Я не понимал, что это будет ссылаться на исходный объект. Спасибо за вашу помощь.   -  person lcleary    schedule 07.01.2021
comment
Факты и мифы об именах и значениях Python   -  person wwii    schedule 07.01.2021