浅拷贝只拷贝了最顶层的,深拷贝拷贝了所有
拷贝牵扯到以下几种形式:
- 赋值操作符=
- copy.copy
- copy.deepcopy
- 列表中的切片[:]
- 字典中的拷贝.copy()
- 列表作为函数参数
1. 当拷贝内容为可变类型时
首先以列表为例,来看python中的深拷贝与浅拷贝:
如下图,a和b的地址是一样的,b只是指向了a的地址。
copy.copy后,d只是开辟了一段新的空间,拷贝了c的引用
copy.deepcopy,是直接拷贝了内容。
简单总结:=就是指向原地址,copy.copy会开辟一个新地址,内部拷贝了可变类型当时的引用;copy.deepcopy所有元素都拷贝
2. 当拷贝内容为不可变类型时
这里以元组为例
简单总结:当拷贝的内容为不可变类型,无论哪种方法都只是简单引用,不会开辟新地址
3. 当拷贝内容为不可变类型但包含可变类型
简单总结:只要包含可变元素,deepcopy就完全拷贝
4. 列表切片中的拷贝
简单总结:列表切片中的拷贝,可copy.copy一样,是浅拷贝
5. 字典中的拷贝
基本认识:字典是无序的,每一个key通过哈希来得到,字典中存储的是key的引用
6. 列表作为函数参数传入