Copy 和 DeepCopy的区别。
Ppython中所有数据类型都是对象,变量名只是一个对象的引用(标签)。
copy:
不可变对象:相当于增加了一个对象引用(新标签),包括简单数据类型和Tuple,Set
>>> a = 123
>>> b = a
>>> c = copy.copy(a)
>>> d = copy.deepcopy(a)
>>> id(a)
1665100880
>>> id(b)
1665100880
>>> id(c)
1665100880
>>> id(d)
1665100880
可变对象:copy一个新的对象,ID不一样,修改和操作与原对象隔离。包括list和dictionary.
需要注意的是所有复杂类型其实是简单类型的集合,每个复杂类型的子元素都有自己的独立ID,Copy只是Copy了集合对象,并没有Copy子元素,所以子元素修改,会影响Copy前和Copy后的值
DeepCopy:
相当于复制整个对象。不管类型是否可以修改,都是一个全新的对象。新老对象修改互不影响。
>>> a1 = [1,2,3,4,[5,6]]
>>> b1 = a1
>>> c1 = copy.copy(a1)
>>> d1 = copy.deepcopy(a1)
>>> # Copy之后对象ID修改
>>> id(a1)
60430736
>>> id(b1)
60430736
>>> id(c1)
59132544
>>> id(d1)
60429496
>>> #但是子元素对象没有修改
>>> id(a1[1])
1665098944
>>> id(b1[1])
1665098944
>>> id(c1[1])
1665098944
>>> id(d1[1])
1665098944
>>> #修改子元素对象值之后,原对象使用新的子元素对象,Copy的对象还是指向旧的子元素对象
>>> a1[1] = 22
>>> id(a1[1])
1665099264
>>> id(b1[1])
1665099264
>>> id(c1[1])
1665098944
>>> id(d1[1])
1665098944
>>> a1
[1, 22, 3, 4, [5, 6]]
>>> b1
[1, 22, 3, 4, [5, 6]]
>>> c1
[1, 2, 3, 4, [5, 6]]
>>> d1
[1, 2, 3, 4, [5, 6]]
>>> #修改对象本身
>>> a1.append(123)
>>> id(a1)
60430736
>>> id(b1)
60430736
>>> id(c1)
59132544
>>> id(d1)
60429496
>>> #子元素为不可变对象还是原来的对象,可变对象也修改了ID,变成了新的对象
>>> id(a1[4])
22852152
>>> id(b1[4])
22852152
>>> id(c1[4])
22852152
>>> id(d1[4])
22852352
>>> #原子对象,还是使用相同对象
>>> id(a1[4][1])
1665099008
>>> id(c1[4][1])
1665099008
>>> id(d1[4][1])
1665099008