Передать словарь в функцию без изменения ранее обработанных значений - PullRequest
1 голос
/ 26 апреля 2020

Я пытаюсь изменить определенные c записи в списке словарей, используя функцию. Однако я не могу изменить одну запись, не изменив их все. Я пробовал каждую комбинацию dict () и .copy (), которую только могу придумать, и не могу заставить это работать. Как я могу это исправить?

a = dict(population[10][2])
b = a.copy()
print(a == b)
print(route_length(a))
print(route_length(b))

True

(3, 0, 1, 1, 1, 1, 2, 2, 0, 0, 2, 0, 5, 4 , 0, 1, 0, 0)

(3, 0, 1, 1, 1, 1, 2, 2, 0, 0, 2, 0, 5, 4, 0, 1, 0, 0)

c = dict(mutate(a))
print(route_length(c))

(2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 3, 0, 6, 4, 0, 2, 0, 0)

d = dict(mutate(b))
print(route_length(c))
print(route_length(d))

(3, 0, 0, 0, 0, 2, 1, 0, 1, 0, 3, 0, 7, 3, 0, 3, 0, 0)

(3, 0, 0, 0, 0, 2, 1, 0, 1, 0, 3, 0, 7, 3, 0, 3, 0, 0)

c == d

True

Я не ожидаю каких-либо конкретных c ответов от 'mutate', просто 'c' и 'd' будут разными. 'mutate' случайным образом переставляет некоторые списки, моя распечатка дает длины разных списков. Я просто использовал, чтобы показать, что что-то происходит, и что каждый раз происходит что-то новое.

1 Ответ

0 голосов
/ 26 апреля 2020

a.copy() создает мелкую копию - будет создан новый объект словаря, и ссылка на объекты в существующем словаре будет вставлена ​​в новый.

Что вам нужно глубокая копия , которая создает новый словарь с рекурсивной копией всех объектов:

import copy
a = dict(population[10][2])
b = copy.deepcopy(a)

Теперь любая модификация в b не будет отражена в исходной копии a.

...