Как сделать, чтобы при изменении данных в одном словаре, во втором всё оставалось прежним?
Есть кусок кода:
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
→ Ссылка
Есть два варианта:
- Использовать конструктор - подойдет, если у вас в словаре нет вложенных
dict | list | tuple.
class Name:
def __init__(self, settings: dict) -> None:
self.settings = dict(settings)
def update(self):
self.settings["key"] = time.time()
- Использовать
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()