Python中的深浅拷贝
【原文参考链接】
我们都知道,Python 是面向对象对象的编程语言,典型的例子就是和Java一样,一切皆对象;但它又和Java有所区别,Python是动态类型的语言,在程序运行时候,会根据对象的类型来确认变量到底是什么类型. 典型的例子就是JavaScript.
要说清楚Python中的深浅拷贝,需要了解下几个简单的概念:
1.【变量-对象-引用】
-
变量:是一个系统表的元素,拥有指向对象的连接的空间
-
对象:是被分配的一块内存,存储其所代表的值
-
引用:是自动形成的从变量到对象的指针
单独赋值
a = 6
在运行a=6后,变量a变成了对象6的一个引用. 在内部,变量事实上是到对象内存空间的一个指针
因为Python的变量不过是对象的引用,或指向对象的指针,因此在程序中可以经常改变变量引用
赋值 | 含义 |
---|---|
x = 42 | 变量绑定到整型对象 |
x = ‘Hello’ | 变量绑定到字符串对象 |
x = [1,2,3] | 变量绑定到列表对象 |
a = 6, 整数对象6包含了两重信息 :
- 值为6
- 一个头部信息:告诉Pthyon解释器,这是个整数对象(相当于一个指向int的指针)
共享引用(赋值)
比如说 a = 6
b = a
a 和 b 同时指向了同一个对象的内存地址
a 和 b 所指向的地址相同
赋值 : 对象之间赋值本质上 是对象之间的引用传递而已。也就是多个对象指向同一个数据空间
【可变对象----不可变对象】
-
Python中不可变对象指:一旦创建就不可修改的对象,包括 字符串,元祖,数字
-
Python中可变对象是指:可以修改的对象,包括:列表、字典
2. 【浅拷贝】
浅拷贝是对一个对象的顶层数据的拷贝
浅拷贝的三种方式:
person = ['name', 'age']
p1 = copy.copy(person)
p2 = person[:]
p3 = list(person)
3. 【深拷贝】
深拷贝是对于一个对象所有层次的拷贝(递归)
4. 【浅拷贝与深拷贝的区别】
赋值与拷贝的区别
- 赋值是引用的改变,而拷贝是重新开辟一片空间
深拷贝与浅拷贝的区别
- 浅拷贝只是拷贝最外层数据,而深拷贝是递归拷贝所有层数据
- 深浅拷贝都是对源对象的复制,占用不同的内存空间
- 如果源对象只有一级目录的话,源做任何改动,不影响深浅拷贝对象
- 如果源对象不止一级目录的话,源做任何改动,都要影响浅拷贝,但不影响深拷贝
- 序列对象的切片其实是浅拷贝,即只拷贝顶级的对象
【python中大部分方法都是浅拷贝如切片】
【字典的copy方法可以拷贝一个字典】
为什么Python中大多数都是浅拷贝呢?
- 时间角度,浅拷贝花费时间更少
- 空间角度,浅拷贝花费内存更少
- 效率角度,浅拷贝只拷贝顶层数据,一般情况下比深拷贝效率高.
浅拷贝对不可变类型和可变类型的copy不同
copy.copy
对于可变类型,会进行浅拷贝copy.copy
和copy.deepcopy
对于不可变类型没有意义,全部等价于对象之间的赋值操作