третей строки мы добавили в словарь переменной b новое значение, почему оно тогда появилось в переменной a?
Вкратце: потому что не надо словари так копировать > > > a = {1: 2} > > > id(a) 4513320064 > > > b = a > > > id(b) 4513320064 > > > a is b True
> > > c = {3: 4} > > > id(c) 4513361152 > > > d = c.copy() > > > id(d) 4513388544 > > > c is d False
можно ли считать a и b - одним и тем же объектом? блин как вопрос то сформулировать правильно...
крч объявив А мы создали объект в памяти, объявив Б равной А - мы просто создали еще одно имя для объекта. Правильно? А когда мы применили метод copy то создали совершенно другой объект, пускай по внешним признаком похожий на исходный.
Всё примерно так. Добавлю ещё, что copy() выполняет "поверхностное" копирование ("shallow copy"). А это означает, что атрибуты копируемого объекта, которые содержат ссылки на другие (третьи) объекты в данным случае сохранят своё значение. Наглядный пример — копирование списка (коллекции, массива) объектов. Список уже будет новым, но элементы в нём будут ссылаться на те же объекты. Если нужно выполнить полное копирование, со всеми вложенными объектами, следует использовать deep_copy(), который рекурсивно обходит поля объектов.
Только, если уж придираться к словам, то не "объявив А", а "инстациировав А". Поскольку "объявив" — это скорее про декларирование класса или функции. Это уже другая тема.
вот если бы с примером - было бы очень круто и понятно.
смотри. Получается, что список list = [1, 2, 3] при copy создаст (условно в памяти) new_list, но 1, 2 , 3 из new_list будут находится в тех же ячейках памяти что и list так?
Я бы не рассматривал пример с интами. Поскольку в питоне (в зависимости от реализации) определённый рэнж значений уже хранится в памяти, и переменные с этими значениями всё время будут ссылаться на одно и то же значение. Например: >>> a = 3 >>> b = 3 >>> a is b # True True Но может быть также: >>> a = 49286081 >>> b = 49286081 >>> a is b # может быть False Давай лучше пример на объектах. >>> import copy >>> class A: pass >>> >>> bar = [A(), ] >>> foo = copy.copy(bar) >>> bar[0] is foo[0] True Теперь с дипкопи: >>> import copy >>> class A: pass >>> >>> bar = [A(), ] >>> foo = copy.deepcopy(bar) >>> bar[0] is foo[0] False Должно быть так. Проверь, плз, а то набирал вручную, не проверяя. (is — проверяет идентичность ссылок в памяти)
Да все так >>> import copy >>> class A: ... pass ... >>> bar = [A(), ] >>> foo = copy.copy(bar) >>> bar[0] is foo[0] True >>> foo = copy.deepcopy(bar) >>> bar[0] is foo[0] False >>> Но, я про другое немного. Уже завтра скорее всего напишу
я вот о чем говорил: >>> some = ['one', 'two'] >>> new_some = copy.copy(some) >>> some[0] is new_some[0] True >>> new_some = copy.deepcopy(some) >>> some[0] is new_some[0] True >>>
Полагаю string interning. Та же хрень, как и с int-ами я выше писал.
Обсуждают сегодня