Python3中copy模块常用功能及其他几种copy方式比较
1、简单的共享引用:
python中内置有小整数常量池和字符串常量池,在某个范围内的相同的数字或字符串分别赋给不同的变量,这些不同的变量都是指向同一块内存地址,这就是所谓的共享引用,举几个简单的例子:
![](http://upload-images.jianshu.io/upload_images/6857741-d24ce658a824d04b.png?imageMogr2/auto-orient/strip|imageView2/2/w/598/format/webp)
字符串的共享引用
![](http://upload-images.jianshu.io/upload_images/6857741-8cb07eb47f002a3f.png?imageMogr2/auto-orient/strip|imageView2/2/w/632/format/webp)
数字的共享引用
单纯的变量的传递其实也是一种共享引用:
![](http://upload-images.jianshu.io/upload_images/6857741-a16d563cdfc14070.png?imageMogr2/auto-orient/strip|imageView2/2/w/576/format/webp)
a,b指向同一个内存地址,任何一方将地址指向的内容做出改变,另外一方会受到影响
2、字典的copy()方法
字典的copy()方法相当于一种深复制,即将原本的字典dic1复制出一个内容一模一样的字典给另一个字典变量dic2,dic1和dic2的内容完全相同,但内存地址不同,不是共享引用,其中任何一方做出改变,另外一方不受影响,举个例子:
3、copy模块的两种copy方法:copy.copy()和copy.deepcopy()
首先导入copy模块,import copy
copy.copy()方法:复制模式跟copy()中参数的类型有关,只能copy最外层(有嵌套时),参数的类型包括可变类型和不可变类型
1、可变类型:当参数是可变类型时,该方法最外层执行的是深度复制,即复制前后的两个变量地址不同,如果原变量中嵌套有可变类型的元素,那么,内层进行的是浅复制,一方改变,另一方会受影响。(即两个变量地址不同,但指向同一块内存区域)
![](http://upload-images.jianshu.io/upload_images/6857741-844aa03d446dd8e4.png?imageMogr2/auto-orient/strip|imageView2/2/w/674/format/webp)
2、不可变类型:当copy()中的参数是不可变类型时,最外层执行浅复制(即两个变量地址相同且指向同一块内存区域),内层也执行浅复制
![](http://upload-images.jianshu.io/upload_images/6857741-4c2e6ee31771f7eb.png?imageMogr2/auto-orient/strip|imageView2/2/w/685/format/webp)
copy.deepcopy():不管参数是否为可变类型,递归地执行深度复制,如果变量中嵌套可变或不可变的变量,在复制时不管内层还是外层均执行深度复制(有一种情况除外),即另外开辟一块内存空间,把原变量所有的内容都复制一份过来,赋给新的变量,两变量虽然内容相同,但地址不同,且分别指向不同的区域,任意一方内容做出改变,另一方不会受到影响。
![](http://upload-images.jianshu.io/upload_images/6857741-8a0c5f6935a2d460.png?imageMogr2/auto-orient/strip|imageView2/2/w/648/format/webp)
参数为可变类型
![](http://upload-images.jianshu.io/upload_images/6857741-96af465ce5d05228.png?imageMogr2/auto-orient/strip|imageView2/2/w/671/format/webp)
参数为不可变类型
注意:
在使用copy.deepcopy()方法时,如果参数为不可变类型,且里面嵌套的对象也是不可变类型,则此方法复制的结果为浅复制(即地址相同)。
![](http://upload-images.jianshu.io/upload_images/6857741-92acb163fb956057.png?imageMogr2/auto-orient/strip|imageView2/2/w/656/format/webp)
以上都是我日常工作的学习与总结,希望知识能积少成多,以后的我一定会感激现在努力的自己。。