Как сделать, чтобы при изменении данных в одном словаре, во втором всё оставалось прежним?

Есть кусок кода:

import time


class Name:
    def __init__(self, settings: dict) -> None:
        self.settings = eval(str(settings))

    def update(self):
        self.settings["key"] = time.time()


settings = {"key":"value"}
SettingsClass = Name(settings)
print(id(settings) == id(SettingsClass.settings))  # 1 output
while id(settings) != id(SettingsClass.settings):
    SettingsClass.update()
    if SettingsClass.settings != settings:
        print('test') #2 output
        settings = SettingsClass.settings

Выполнение кода принесет:
False
test

Я где-то видел что, class принимая значения dict|list|tuple, берет только ссылку на переменную. А мне нужно чтобы это были 2 независимые переменные. Чтобы при изменении данных в одном словаре, во втором всё оставалось прежним до тех пор, пока не дойдет очередь до изменения. То есть: чтобы settings не изменялась вместе с SettingsClass.settings, пока не дойдет до кода settings = SettingsClass.settings (хотя именно из-за такого приравнивания, id становаятся одинаковыми и именно в этот момент копируется только ссылка на эту переменную).


Ответы (1 шт):

Автор решения: n1tr0xs

Есть два варианта:

  1. Использовать конструктор - подойдет, если у вас в словаре нет вложенных dict | list | tuple.
class Name:
    def __init__(self, settings: dict) -> None:
        self.settings = dict(settings)

    def update(self):
        self.settings["key"] = time.time()
  1. Использовать copy.deepcopy - следует использовать, если есть вложенные dict | list | tuple
import copy

class Name:
    def __init__(self, settings: dict) -> None:
        self.settings = copy.deepcopy(settings)

    def update(self):
        self.settings["key"] = time.time()
→ Ссылка