Решение
Создайте для этого функцию.
Ваше намерение будет более ясным, когда вы будете использовать его в коде, и вы сможете обрабатывать сложные решения (например, глубокое или мелкое копирование) в одном месте.
def copy_dict(source_dict, diffs):
"""Returns a copy of source_dict, updated with the new key-value
pairs in diffs."""
result=dict(source_dict) # Shallow copy, see addendum below
result.update(diffs)
return result
И теперь копия является атомарной, при условии, что никакие потоки не вовлечены:
setup2=copy_dict(setup1, {'param1': val10, 'param2': val20})
Приложение - глубокая копия
Для примитивов (целых чисел и строк) глубокое копирование не требуется:
>>> d1={1:'s', 2:'g', 3:'c'}
>>> d2=dict(d1)
>>> d1[1]='a'
>>> d1
{1: 'a', 2: 'g', 3: 'c'}
>>> d2
{1: 's', 2: 'g', 3: 'c'}
Если вам нужна глубокая копия, используйте модуль copy
:
result=copy.deepcopy(source_dict) # Deep copy
вместо:
result=dict(setup1) # Shallow copy
Убедитесь, что все объекты в вашем словаре поддерживают глубокое копирование (любой объект, который может быть pickled
, должен это делать).