深拷贝与浅拷贝
简介#
Python 中的拷贝机制有两种,一种是深拷贝一种是浅拷贝,下面深入学习一下:
浅拷贝#
简介#
浅拷贝是对于一个对象的顶层拷贝,通俗的理解是:拷贝了引用,并没有拷贝内容。
例子#
>>> a = [1,2,3]
>>> b = a
>>> id(a)
4382391344
>>> id(b)
4382391344
a 和 b 指向的数据的内存地址相同,说明变量在赋值时就是将数据的引用复制了一份给另一个变量
深拷贝#
简介#
深拷贝是对于一个对象所有层次的拷贝 (递归)
例子#
>>> c = copy.deepcopy(a)
>>> id(a)
4382391344
>>> id(c)
4383457680
>>> id(a[0])
4379642784
>>> id(b[0])
4379642784
>>> id(c[0])
4379642784
浅拷贝列表里的元素也是直接拷贝的引用,深拷贝则是进行了深层次的拷贝,所有内存地址都不一样
copy
#
浅拷贝可以使用 copy.copy
来实现。对不可变类型和可变类型的 copy
不同,copy.copy
对于可变类型会进行浅拷贝,对于不可变类型不会拷贝仅仅是指向。
>>> a.append(4)
>>> a
[1, 2, 3, 4]
>>> b
[1, 2, 3, 4]
>>> d
[1, 2, 3]
copy.copy 和 copy.deepcopy 的区别#
>>> a = [1,2,3]
>>> b = (a,)
>>> c = [b,]
>>> d = copy.copy(c)
>>> c
[([1, 2, 3],)]
>>> d
[([1, 2, 3],)]
>>> a.append(4)
>>> c
[([1, 2, 3, 4],)]
>>> d
[([1, 2, 3, 4],)]
>>> id(c)
4383457680
>>> id(d)
4382391344
>>> id(c[0])
4383618320
>>> id(d[0])
4383618320
d = c
让 d 这个变量指向 c 指向的空间,d = copy.copy
是赋值所有 c 指向的数据到一个新的空间,但是不会递归 copy
>>> e = copy.deepcopy(c)
>>> c
[([1, 2, 3, 4],)]
>>> e
[([1, 2, 3, 4],)]
>>> id(c)
4383457680
>>> id(e)
4383582240
>>> id(c[0])
4383618320
>>> id(e[0])
4384001616
>>> a.append(5)
>>> c
[([1, 2, 3, 4, 5],)]
>>> d
[([1, 2, 3, 4, 5],)]
>>> e
[([1, 2, 3, 4],)]
当使用 copy.deepcopy
后会将 c 指向的空间进行递归 copy,相当于进行了深层次的拷贝,所以改变 a 不会影响到 e