python--浅拷贝和深拷贝

(1)copy浅拷贝,没有拷贝子对象,所以原始数据改变,子对象会改变

>>> alist=[1,2,3,["a","b"]]
>>> import copy
>>> c = copy.copy(alist)
>>> print(alist)
[1, 2, 3, ['a', 'b']]
>>> print(c)
[1, 2, 3, ['a', 'b']]

>>> print(id(alist))
1901101263176
>>> print(id(c))
1901101300616-----内存地址发生了改变,拷贝了外层
>>> print(id(alist[0]))
1946643936
>>> print(id(c[0]))
1946643936--------元素地址,未变
>>> print(id(alist[1]))
1946643968
>>> print(id(c[1]))
1946643968--------元素地址,未变
>>> print(id(alist[2]))
1946644000
>>> print(id(c[2]))
1946644000--------元素地址,未变
>>> print(id(alist[3]))
1901101263560
>>> print(id(c[3]))
1901101263560--------元素地址,未变
>>> alist.append(5)
>>> print(alist)
[1, 2, 3, ['a', 'b'], 5]------外层地址中增加一个元素,
>>> print(c)
[1, 2, 3, ['a', 'b']]-------外层地址不一样,不会影响这个外层列表
>>> alist[3]
['a', 'b']
>>> alist[3].append("ccc")
>>> print(alist)
[1, 2, 3, ['a', 'b', 'ccc'], 5]
>>> print(c)
[1, 2, 3, ['a', 'b', 'ccc']]-----由于不会拷贝内层子元素地址,所以修改会跟着改变

(2)深拷贝,包含对象里面的子对象的拷贝,所以原始对象的改变不会造成深拷贝里任何子元素的改变

>>> import copy
>>> alist = [1,2,3,['a','b']]
>>> d = copy.deepcopy(alist)
>>> print(alist)
[1, 2, 3, ['a', 'b']]
>>> print(d)
[1, 2, 3, ['a', 'b']]-----始终没有改变
>>> print(id(alist))
2257173957256
>>> print(id(d))
2257173978760-----生成一个新的内存地址
>>> print(id(alist[0]))
1946643936
>>> print(id(d[0]))
1946643936---------数字类型,不可变,引用同一块内存地址
>>> print(id(alist[1]))
1946643968
>>> print(id(d[1]))
1946643968---------数字类型,不可变,引用同一块内存地址
>>> print(id(alist[2]))
1946644000
>>> print(id(d[2]))
1946644000---------数字类型,不可变,引用同一块内存地址
>>> print(id(alist[3]))
2257173957640
>>> print(id(d[3]))
2257173978376-----列表类型,可变,从新生成了一个新的内存地址
>>> alist.append(5)
>>> print(alist)
[1, 2, 3, ['a', 'b'], 5]
>>> print(d)
[1, 2, 3, ['a', 'b']]
>>> alist[3].append('cccc')
>>> print(alist)
[1, 2, 3, ['a', 'b', 'cccc'], 5]
>>> print(d)
[1, 2, 3, ['a', 'b']]-------始终没有改变
---------------------------------------------------------------------------------------------------------------

总结,浅拷贝,只拷贝最外层,生成一个新的内存地址,对最外层里面一层不可变数据类型的改变不会影响另一份拷贝数据,但是对可变数据类型,因为引用的是同一块内存地址,所用,源数据的改变会造成拷贝数据的改变

深拷贝,不仅拷贝最外层,生成一个新的内存地址,对立面的子可变对象也拷贝,生成一个新的内存地址,所以说,深拷贝情况下,拷贝数据一直不会改变

原文地址:https://www.cnblogs.com/xudachen/p/8552828.html