python的拷贝(深拷贝和浅拷贝)
今天看了几篇关于python拷贝的博文,感觉不太清楚,所以我就自己做实验试一下,特此记录。
拷贝是针对组合对象说的,比如列表,类等,而数字,字符串这样的变量是没有拷贝这一说的。
实现拷贝有:
1.工厂函数
2.切片操作
3.对象的copy方法
4.copy模块的copy方法
Notice:在python2.2之后将一些原来的内建函数和一些没有的内建函数转换成了工厂函数,而这些内建函数一些现在仍然有。
工厂函数虽然貌似函数,但它是一个类。
内建函数大概有这些(未详细考证):
int(),long(), float(), complex()
str(), unicode(), basestring()
list(), tuple()
type()
dict(), bool(),set(), frozenset(),object(),classmethod(),staticmethod(),super(),property(),file()
- “基本”是指这些类型都是Python提供的标准或者核心类型;
- “内建”是由于这些类型是Python默认就提供的;
- “数据”是因为他们用于一般数据存储;
- “对象”是因为对象是数据和功能的默认抽象;
- “原始”是因为这些类型提供的是最底层的粒度数据存储;
- “类型”是因为他们就是数据类型
python默认的拷贝类型是浅拷贝
浅拷贝就是对象是新的对象,但是内部的元素是对原对象的引用。请看图
可以看出a,b,c,d其本身的id并不相同但是其内部元素的id却是一样的。
而深拷贝就是对象与对象内部元素都与原对象没有任何关系,在拷贝的时候,对象被创建以后会递归拷贝原对象内部元素。
是不是对象本身与对象内部元素的id都不同啊。