python deepcopy и мелкая копия и ссылка на проход

Вопрос о глубокой копии питона и мелкой копии.

сообщение в чем разница между глубокой копией и мелкой копией?

не может мне помочь.

почему, например, 1-я сумма равна 6 не 10?

eg1:

kvps = { '1' : 1, '2' : 2 } theCopy = kvps.copy() # both point to the same mem location ? kvps['1'] = 5 sum = kvps['1'] + theCopy['1'] print sum 

выходная сумма – 6

eg2:

 aList = [1,2] bList = [3,4] kvps = { '1' : aList, '2' : bList } theCopy = kvps.copy() # both point to the same mem location ? kvps['1'][0] = 5 sum = kvps['1'][0] + theCopy['1'][0] print sum 

выходная сумма равна 10

eg3:

 import copy aList = [1,2] bList = [3,4] kvps = { '1' : aList, '2' : bList } theCopy = copy.deepcopy(kvps) kvps['1'][0] = 5 sum = kvps['1'][0] + theCopy['1'][0] print sum 

выходная сумма – 6.

Кроме того, например, 4

 kvps = { '1' : 1, '2' : 2 } theCopy = dict(kvps) # theCopy hold a reference to kvps ? kvps['1'] = 5 # should also change theCopy , right ? sum = kvps['1'] + theCopy['1'] print kvps print theCopy print sum 

его сумма равна 6, если Copy является ссылкой на kvps, она должна быть 10.

Мелкая копия копирует изменяемые объекты в контейнере верхнего уровня. Глубокая копия создает новый экземпляр всех изменяемых контейнеров в структуре данных.

«например, 2» приводит к 10, потому что вы копируете dict снаружи, но два списка внутри по-прежнему являются старыми списками, а списки могут быть изменены на месте (они изменяемы).

Глубокая копия позволяет запускать aList.copy (), bList.copy () и заменяет значения в вашем dict своими копиями.


например, 1:

 kvps = {'1': 1, '2': 2} theCopy = kvps.copy() # the above is equivalent to: kvps = {'1': 1, '2': 2} theCopy = {'1': 1, '2': 2} 

Когда вы применяете это, например, 2:

 kvps = {'1': aList, '2': bList} theCopy = {'1': aList, '2': bList} 

Объектами списка в обоих dicts являются одни и те же объекты, поэтому изменение одного из списков будет отражено в обоих dict.


Выполнение глубокой копии (например, 3) приводит к следующему:

 kvps = {'1': aList, '2': bList} theCopy = {'1': [1, 2], '2': [3, 4]} 

Это означает, что оба dicts имеют совершенно другое содержимое, а изменение одного не изменит другого.


например, 4 через dict() эквивалентно мелкой копии.

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

ЭГ2
Клавиши скопированы. Оба ключа указывают на одни и те же объекты. Назначение изменяет объект, на который указывают обе клавиши (хотя обе клавиши находятся в разных местах в памяти), поэтому изменение видно и в сумме.

EG3
Все скопировано. Каждый ключ указывает на собственную копию объектов. Теперь в памяти есть два «aList». AList, на который указывает KVPS, изменяется, а «aList», на который указывает COPY, – нет.

http://docs.python.org/library/copy.html