1:浅拷贝&深拷贝

二、浅拷贝

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

来源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容