Python—copy(),deepcopy()的区别
copy()与deepcopy()之间的主要区别是python对数据的存储方式。
**deepcopy(),**即将被复制对象完全再复制一遍作为独立的新个体单独存在。所以改变原有被复制对象不会对已经复制出来的新对象产生影响。
**copy(),**并不会产生一个独立的对象单独存在,他只是将原有的数据块打上一个新标签,所以当其中一个标签被改变的时候,数据块就会发生变化,另一个标签也会随之改变。
—–而浅复制要分两种情况进行讨论:
如 list 中套着 list 的情况,shallow copy 中的 子list,并未从原 object 真的「独立」出来。也就是说,如果你改变原 object 的子 list 中的一个元素,你的 copy 就会跟着一起变
当浅复制的值是不可变对象(数值,字符串,元组)时,代码如下:
a = '23456'
b = a
id(a)
Out[73]: 1747095961840
id(b)
Out[74]: 1747095961840
import copy
c = copy.copy(a)
当浅复制的值是不可变对象(数值,字符串,元组)时和“等于赋值”的情况一样,对象的id值与浅复制原来的值相同。
当浅复制的值是可变对象(列表,字典)时,改变的值不是复杂子对象 代码如下:
l1 = [1,2,3]
l2 = l1
l3 = copy.copy(l1)
id(l1)
Out[82]: 1747212842504
id(l2),id(l3)
Out[83]: (1747212842504, 1747212440392)
l1.append(55)
print(l1),print(l2),print(l3)
[1, 2, 3, 55]
[1, 2, 3, 55]
[1, 2, 3]
第一种情况:复制的 对象中无 复杂 子对象,原来值的改变并不会影响浅复制的值,同时浅复制的值改变也并不会影响原来的值。原来值的id值与浅复制原来的值不同。
当浅复制的值是可变对象(列表,字典)时,改变的值是 复杂子对象 代码如下:
import copy
>>> list1=[1,2,['a','b']]
>>> list2=list1
>>> list3=copy.copy(list2)
>>> list4=copy.deepcopy(list3)
>>> id(list1)
4338414656
>>> id(list2)
4338414656
>>> id(list3)
4338415016
>>> id(list4)
4338414368
>>> list1[2].append('a')
>>> id(list1)
4338414656
>>> print list1
[1, 2, ['a', 'b', 'a']]
>>> print list3
[1, 2, ['a', 'b', 'a']]
>>> print list4
[1, 2, ['a', 'b']]
>>> list1.append(33)
>>> id(list1)
4338414656
>>> id(list3)
4338415016
>>> print list1
[1, 2, ['a', 'b', 'a'], 33]
>>> print list3
[1, 2, ['a', 'b', 'a']]
复制的对象中有 复杂 子对象 (例如列表中的一个子元素是一个列表),如果不改变其中复杂子对象,浅复制的值改变并不会影响原来的值。 但是改变原来的值 中的复杂子对象的值 会影响浅复制的值