Python присваивает неверные значения словаря

1

В моем коде:

line_x = 10
c = 'A'
d = 'B'
a = {}
a['one']='|   |   |   |   |   |'
a['two']='|   |   |   |   |   |'
#untill thirteen

vak = a.keys()
b = a #copy the dictionary
spot = a[vak[0]]
spot2 = b[vak[0]]
a[vak[0]] = spot[:(line_x)]+ d+ spot[(line_x+1):]
b[vak[0]] = spot2[:(line_x)]+ c+ spot2[(line_x+1):]

print a[vak[0]] #output_a = |   |   | A |   |   |
print b[vak[0]] #output_b = |   |   | A |   |   | <- which should be a 'B' in the middle

У меня возникли проблемы с копированием словаря и изменением значения.

Когда я хочу изменить значение в одном из словарей, изменяется значение как оригинала, так и копии. Но я хочу, чтобы оригинал изменился и у меня была копия, чтобы перейти на что-то еще. Я не могу найти проблему, хотя она находится в таком маленьком и относительно легком коде.

  • 2
    Я отредактировал ваш вопрос, чтобы добавить код. В будущем, пожалуйста, вставьте код в ваш вопрос. Людям легче смотреть на ваш код и давать вам ответ. Если ваш код слишком длинный (чего не происходит в вашем случае), то вы можете подумать о сжатии вашего кода и вставке только тех существенных особенностей, которые относятся к вашей проблеме в этом вопросе.
Теги:
dictionary

2 ответа

5
Лучший ответ

b = a не копирует словарь, он перепроверяет b чтобы указать на тот же объект, что a (так что при изменении a вы также можете наблюдать эффект на b). Вместо этого используйте b = copy.copy(a) (модуль copy).

  • 1
    Для мелкой копии, которую вы создаете, вы также можете просто использовать b = dict(a)
  • 0
    @ThiefMaster: я нахожу copy более описательной.
Показать ещё 1 комментарий
3

b = a #copy the dictionary

не копирует словарь, просто его ссылку. Вы должны скопировать его явно:

b = copy(a)

Это создаст копию словаря, и вы сможете манипулировать ими, и это сработает. Просто помните, что изменяемые объекты в словарях будут меняться в обоих (если они все еще присутствуют в обоих), если вы измените их на один. Взгляните на это:

http://en.wikipedia.org/wiki/Object_copy#Deep_vs._Shallow_vs._Lazy_copy

  • 0
    Спасибо вам обоим, это, безусловно, поможет!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню