Форум сайта python.su
Добрый день.
Наткнулся на такие проблемы:
1. Если я правильно понимаю, то ниже приведенным способом я создаю по сути указатель, а не новую переменную.
>>> a ={'a' : 1, 'b' : 2}
>>> b = a
>>> b['a'] = 4
>>> b
{'a': 4, 'b': 2}
>>> a
{'a': 4, 'b': 2}
>>> x = dict(good = 10, bad = 3, evil = 4)
>>> x
{'bad': 3, 'good': 10, 'evil': 4}
Офлайн
1.
>>> a ={'a' : 1, 'b' : 2}
>>> b = dict(a)
>>> b['a'] = 4
>>> a, b
({'a': 1, 'b': 2}, {'a': 4, 'b': 2})
>>> b = a.copy()
>>> b['a'] = 4
>>> a, b
({'a': 1, 'b': 2}, {'a': 4, 'b': 2})
>>> import copy
>>> b = copy.deepcopy(a) # Создаем полную копию
>>> b['a'] = 4
>>> a, b
({'a': 1, 'b': 2}, {'a': 4, 'b': 2})
Офлайн
1. Используйте модуль copy (вы правильно поняли, передается ссылка, а не копия)
from copy import copy, deepcopy
b = copy(a)
c = deepcopy(a)
RetroПотому что он так устроен.
просто не совсем понятно, почему он выводит их в произвольном порядке.
Офлайн
Спасибо за ответы.
1.
b = dict(a)
Новый словарь с элементами старого - красиво и просто. Надеюсь, что тут нет подвоха и он тождественен a.copy().
2.
Спасибо, OrderedDict выручает, хотя и требует вводить ключи насильно, по порядку.
Офлайн
regallУ словарей есть метод copy, так что модуль может не пригодиться.
Используйте модуль copy (вы правильно поняли, передается ссылка, а не копия)
…
copy - для линейных структур.
deepcopy - для копирования иерархических.
Офлайн
docs.python.org
The difference between shallow and deep copying is only relevant for compound objects (objects that contain other objects, like lists or class instances):
A shallow copy constructs a new compound object and then (to the extent possible) inserts references into it to the objects found in the original.
A deep copy constructs a new compound object and then, recursively, inserts copies into it of the objects found in the original.
Офлайн
Чаще всего - именно таки дефекты в архитектуре. Но как затычка deepcopy бывает очень к месту.
Офлайн