深拷贝与浅拷贝

未匹配的标注

简介#

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

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~