目录

Python学习之路-深拷贝与浅拷贝

简介

Python中的拷贝机制有两种,一种是深拷贝一种是浅拷贝,下面深入学习一下:

浅拷贝

简介

浅拷贝是对于一个对象的顶层拷贝,通俗的理解是:拷贝了引用,并没有拷贝内容。

例子

1
2
3
4
5
6
7
>>> a = [1,2,3]
>>> b = a
>>> id(a)
4382391344
>>> id(b)
4382391344

a和b指向的数据的内存地址相同,说明变量在赋值时就是将数据的引用复制了一份给另一个变量

深拷贝

简介

深拷贝是对于一个对象所有层次的拷贝(递归)

例子

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
>>> 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对于可变类型会进行浅拷贝,对于不可变类型不会拷贝仅仅是指向。

1
2
3
4
5
6
7
>>> a.append(4)
>>> a
[1, 2, 3, 4]
>>> b
[1, 2, 3, 4]
>>> d
[1, 2, 3]

copy.copy和copy.deepcopy的区别

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
>>> 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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
>>> 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