二、浅拷贝
2.1、浅拷贝是对于一个对象的顶层拷贝,简单的理解是:拷贝了引用,并没有拷贝内容。
2.2、 看一个最简单的浅拷贝
以上:a 与 b 的内存地址相同,说明了当给一个变量赋值的时候,其实就是将数据的引用赋值了一份给另外一个变量,这其实就是最简单的浅拷贝,不仅列表是这样,只要是 类似于 xx1 = xx2 的这种基本都是 浅拷贝,如下:
因为都是浅拷贝,所以只要通过一个引用进行了修改,那么另外一个变量就看到的数 据也就变化了
2.3、import copy 模块中 copy.copy() 的使用
三、深拷贝
3.1、深拷贝是对于一个对象所有层次的拷贝(递归)
以上结果通过deepcopy()确实将列表 a 中所有的数据的引用 copy 了,而不是只拷贝了 a 指向的列表的引用,看如下,a的数据发生变化的时候,b并不会发生变化
3.2、进一步理解 深拷贝
四、拷贝的其他方式
4.1、分片表达式 可以赋值一个序列
d=c[:] 与 d=copy.copy(c) 一样 属于 浅拷贝
4.2、字典的copy方法可以拷贝一个字典
五、注意点
5.1、浅拷贝对不可变类型和可变类型的copy不同
copy.copy 对于 可变类型,会进行浅拷贝
解释一下大家的对于a变化,而b不变化的问题,因为b拷贝的是a里面 11,22引用的指向,当a添加 33的时候,而 11,22引用的指向并没有发生变化,所以并不会发生变化
copy.copy 对于 不可变类型,不会拷贝,仅仅是指向
如果c是元组,那么copy时会,仅仅是元组的引用copy,而 deepcopy依然是深copy,即递归copy所有
5.2、copy.copy和copy.deepcopy的区别
copy.copy
d = c # 让d这个变量指向c指向的空间,d = copy.copy(c) # 复制所有c指向的数据到一个新的空间,但是不会递归copy
copy.deepcopy
>>> a = [11,22]
>>> b = (a,)
>>> c = [b]
>>>
>>> d = copy.deepcopy(c)
>>>
>>> c
[([11, 22],)]
>>> d
[([11, 22],)]
>>>
>>> id(c)
4528932680
>>> id(d)
4528761928
>>>
>>> id(c[0])
4528913040
>>> id(d[0])
4528913096
>>>
>>> a.append(33)
>>>
>>> c
[([11, 22, 33],)]
>>> d
[([11, 22],)]
>>>
作者:IIronMan
链接:https://www.jianshu.com/p/42a7a7c081cc
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。