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]
>>> 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