深拷贝与浅拷贝

未匹配的标注

简介

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
发起讨论 查看所有版本


暂无话题~