在我们进行Python编程的时候,复制(拷贝)数据结构是一种常见的操作,比如当我们想要保留原始数据,对生成的数据副本进行修改时。Python中提供了两种不同的数据拷贝方式:浅拷贝和深拷贝,这两种方式在拷贝数据结构时有很大的不同,在实际编程中我们需要结合程序的性能和应用场景选择合适的拷贝方法。
变量传递引用
我们知道在Python中,变量可以存放对于对象的引用(内存地址),当我们创建一个对象并且将其分配给一个变量时,这个变量就存储了该对象的引用,如果还有另外一个变量同时引用这个相同的对象,那么对其中一个变量所引用的对象所做的修改,另一个变量引用的对象也会发生变化。
class Student:
def __init__(self, name):
self.name = name
a = Student('张三')
# a与b都是存放的对应Student对象的引用,b并没有重复存放Student对象,而是存放了对于其对象的引用
b = a
a.name = '李四'
# 当修改Student对象时,b引用的对象都会发生变化
print(a.name)
print(b.name)
一层对象深浅拷贝
Python的copy
模块提供了copy()
函数来实现浅拷贝和deepcopy()
函数来实现深拷贝。
通过下图内存分配过程,我们可以看到对于简单的一层数据结构对象,再进行深浅拷贝时并没有什么差异,两者的表现相同:
- 对于可变类型 列表、字典、集合,使用深浅拷贝会复制对象并且创建新的内存空间
- 对于不可变类型 数字、字符串、元组,使用深浅拷贝不会开辟新的内存空间,是通过引用指向原来的
复合对象深浅拷贝
当对复合对象结构进行拷贝时,深拷贝和浅拷贝的表现就有很大的差异:
- 浅拷贝仅对数据结构的第一层进行拷贝,并不会拷贝子级(内部)
- 深拷贝是对数据结构是所有层次的拷贝,递归拷贝所有层级。
深浅拷贝对比:
- 浅拷贝通常比深拷贝更快,因为它不需要递归复制每个子对象
- 深拷贝在拷贝复杂对象时会消耗较多时间和内存,因为它需要给每个嵌套对象创建新的内存空间
欢迎来到testingpai.com!
注册 关于