本文主要参考这篇博文python浅拷贝与深拷贝
基本概念
首先了解python中的一些基本概念
- 变量:是一个系统表的元素,拥有指向对象的连接空间
- 对象:被分配的一块内存,存储其所代表的值
- 引用:是自动形成的从变量到对象的指针(一个动作)
- 类型:属于对象,而非变量
- 可变对象(重点):可以修改的对象,包括列表、字典、集合
- 不可变对象(重点):一旦创建就不可修改的对象,包括字符串、元组、数值类型
深浅拷贝主要与可变对象和不可变对象有关,可变对象表明其指向内存中的值可以改变,当修改变量值时,其指向的内容空间中的值直接修改,并没有开辟新地址;不可变对象改变后,其所指的值不能被改变,相当于“抛弃”了原来地址中的值,重新开辟了一块地址进行赋值,并指向该地址
拷贝方法
对象的拷贝主要有三种方法
- 直接赋值:赋值的是对象的引用
- 浅拷贝(copy):拷贝父对象,不会拷贝对象内部的子对象
- 深拷贝(deepcopy):引入copy模块的deepcopy方法,完全拷贝父对象与子对象
可变对象的拷贝
可变对象有列表、字典和集合,下面展示一个例子: 例子来源
字典的浅拷贝
1 | a = {1: [1,2,3]} |
字典的深拷贝
1 | >>>import copy |
深浅拷贝的图示解释如下
- 赋值引用b=a: a和b指向同一对象
- 浅拷贝b=a.copy(): a和b是独立的对象,但他们的子对象还是指向同一对象,也就是说改变其中任何一个子对象,两个值均发生改变
- 深拷贝b=copy.deepcopy(a): a和b完全拷贝了父对象及其子对象,两者是完全独立的
其中红色部分代表两个变量的共有部分,即修改一个另一个也随之变化;黑色部分是独立部分
更多实例
1 | import copy |
不可变对象的拷贝
不可变对象的深浅拷贝就不重要了,因为地址本身的内容是不可变的,所以如果我们要改变变量的值,就必须改变其地址,类似于可变对象中的深拷贝
1 | a = (1,2,3) |