Python基础知识——深浅拷贝
深浅拷贝:
概述:
拷贝一般分两种,浅拷贝和深拷贝
总的来说,
浅拷贝只拷贝原数据的一层,其他层依然会对原数据造成影响
深拷贝则将原数据全部拷贝,不对原数据造成影响
浅拷贝:
`
>>> a = [[1,2], 3, 4]
>>> b = a.copy()
>>> b[0][1] = 'a'
>>> b[1] = "hello"
>>> b
[[1, 'a'], 'hello', 4]
>>> a
[[1, 'a'], 3, 4]
`
原理:
copy()方法即浅拷贝,包括所有数据的copy()方法,都为浅拷贝
如上述运行结果可知,当修改b中的元素的时候,既有可能对a产生影响,也有可能无影响
具体原理如下图:

- 如图所示,a中储存的是四个地址,分别指向其中的四个元素,b通过copy方法对a进行复制时,即在a所指向的四个地址之外的空间开辟另外一段内存,并将a指向的地址的内容完整的复制过来,并通过b中存储的地址进行指向,这样就完成了浅拷贝
- 显然,当b中的3和4被修改时,不会对a中的数据造成任何影响,因为b已经将值完整的复制过来了,而对于a中的有引索关系的数据结构而言,因为a中存储的数据只是实际数据的地址,所以,b中复制过去的也是地址,而数据的实际存储地址并未发生改变,因此,当b要改变1或2的值时,首先会找到1或2所在的内存地址,然后对内存进行直接修改,由于a中存的也是地址,因此当a再次去取1或2时,此时内存的内容已经被b修改了,所以a取得也是修改后的内容
- 所以可以说浅拷贝仅拷贝一层,使用时与要多注意。
深拷贝:
`
>>> import copy
>>> a = [[1,2],3,4]
>>> c = copy.copy(a)
>>> b = copy.deepcopy(a)
>>> b[0][0] = 'changed'
>>> c[0][1] = 'changed'
>>> a
[[1, 'changed'], 3, 4]
>>> b
[['changed', 2], 3, 4]
>>> c
[[1, 'changed'], 3, 4]
`
深拷贝需导入copy模块,
其中copy的copy()方法即为浅拷贝
deepcopy()方法即为深拷贝
- 根据运行结果可以看出:
- 深拷贝即把数据直接复制在一个新的内存里,包括其中的带索引的数据,也会将多层的数据都存在新的内存里,因此不会对原数据产生任何影响
注意:
>>> a = [[1,2],3,4]
>>> b = a
>>> b
[[1, 2], 3, 4]
>这种方式不是拷贝,而是将变量名直接赋值,也即是说b指向的地址与a的相同,
>所以修改b中的任意数据,a也都会改变,并没有为b开创一块新的内存,而是直接将b指向与a相同的地方

浙公网安备 33010602011771号