170 похожих чатов

A = {"key_1": 1, "key_2": 2} b = a b["key_3"] = 3 print(a) print(b) В

третей строки мы добавили в словарь переменной b новое значение, почему оно тогда появилось в переменной a?

13 ответов

25 просмотров

Вкратце: потому что не надо словари так копировать > > > 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 - одним и тем же объектом? блин как вопрос то сформулировать правильно...

И друг мой грузовик 🚛
можно ли считать a и b - одним и тем же объектом? ...

крч объявив А мы создали объект в памяти, объявив Б равной А - мы просто создали еще одно имя для объекта. Правильно? А когда мы применили метод copy то создали совершенно другой объект, пускай по внешним признаком похожий на исходный.

И друг мой грузовик 🚛
крч объявив А мы создали объект в памяти, объявив ...

Всё примерно так. Добавлю ещё, что copy() выполняет "поверхностное" копирование ("shallow copy"). А это означает, что атрибуты копируемого объекта, которые содержат ссылки на другие (третьи) объекты в данным случае сохранят своё значение. Наглядный пример — копирование списка (коллекции, массива) объектов. Список уже будет новым, но элементы в нём будут ссылаться на те же объекты. Если нужно выполнить полное копирование, со всеми вложенными объектами, следует использовать deep_copy(), который рекурсивно обходит поля объектов.

И друг мой грузовик 🚛
крч объявив А мы создали объект в памяти, объявив ...

Только, если уж придираться к словам, то не "объявив А", а "инстациировав А". Поскольку "объявив" — это скорее про декларирование класса или функции. Это уже другая тема.

Ihor 🐈 C.
Всё примерно так. Добавлю ещё, что copy() выполняе...

вот если бы с примером - было бы очень круто и понятно.

Ihor 🐈 C.
Всё примерно так. Добавлю ещё, что 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 — проверяет идентичность ссылок в памяти)

Ihor 🐈 C.
Я бы не рассматривал пример с интами. Поскольку в ...

Да все так >>> 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 >>> Но, я про другое немного. Уже завтра скорее всего напишу

Ihor 🐈 C.
Я бы не рассматривал пример с интами. Поскольку в ...

я вот о чем говорил: >>> 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 >>>

И друг мой грузовик 🚛
я вот о чем говорил: >>> some = ['one', 'two'] >>>...

Полагаю string interning. Та же хрень, как и с int-ами я выше писал.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта