Правда ли, что «Python никогда не копирует объекты неявным образом»? - PullRequest
0 голосов
/ 04 мая 2018

Я нашел это утверждение в одном из ответов на на этот вопрос .

Что это значит? У меня не было бы проблем, если бы утверждение было «Python никогда неявно копирует объекты словаря». Я полагаю, что в python кортежи, списки, множества и т. Д. Считаются «объектами», но проблема со словарем, как описано в вопросе, не возникает с ними.

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Python имеет много сложных типов. они делятся на две группы:
1) без изменений - целое число, строка, кортеж
2) изменить - список, словарь
например:
- без изменений

x = 10

для этого 'x' python создайте новый объект, такой как 'Int', со ссылкой в ​​памяти 0x0001f0a

x += 1 # x = x + 1

python создает новую ссылку в памяти как 0x1003c00 - изменить

x = [1, 2, 'spam']

для этого 'x' python создайте новый объект, такой как 'Int', со ссылкой в ​​памяти 0x0001f0a

y = x

Python скопировать ссылку с 'x' на 'y'

0 голосов
/ 04 мая 2018

Утверждение в связанном ответе шире, чем должно быть. Неявные копии редки в Python, и в тех случаях, когда они случаются, можно утверждать, что Python выполняет неявную копию, но они случаются.

Что действительно верно, так это то, что стандартные правила присвоения имен не включают копию. По умолчанию

a = b

не будет копировать объект, назначенный на a. Это значение по умолчанию может быть переопределено пользовательским локальным объектом пространства имен, что может произойти при использовании exec или метаклассе с методом __prepare__, но это происходит крайне редко.

Что касается случаев, когда неявные копии действительно происходят, первое, что приходит на ум, - это то, что стандартный библиотечный модуль multiprocessing выполняет неявные копии повсеместно, что является одной из причин, по которой multiprocessing вызывает много путаницы. Присвоения, отличные от присвоения имени, могут также включать копии; a.b = c, a[b] = c и a[b:c] = d могут включать копии, в зависимости от того, что является a. a[b:c] = d особенно вероятно будет включать копирование данных d, хотя обычно это не будет связано с созданием объекта, который является копией d.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...