深浅拷贝copy()和deepcopy()
来源:互联网 发布:淘宝围巾店推荐知乎 编辑:程序博客网 时间:2024/05/17 22:31
要说清楚Python中的深浅拷贝,需要搞清楚下面一系列概念:
变量-引用-对象(可变对象,不可变对象)-切片-拷贝(浅拷贝,深拷贝)
【变量-对象-引用】
在Python中一切都是对象,比如说:3, 3.14, ‘Hello’, [1,2,3,4],{‘a’:1}……
甚至连type其本身都是对象,type对象
Python中变量与C/C++/Java中不同,它是指对象的引用,Python是动态类型,程序运行时候,会根据对象的类型
来确认变量到底是什么类型。
单独赋值: 比如说:
a = 3
在运行a=3后,变量a变成了对象3的一个引用。在内部,变量事实上是到对象内存空间的一个指针
因为Python的变量不过是对象的引用,或指向对象的指针,因此在程序中可以经常改变变量引用
>>> x = 42 #变量绑定到整型对象>>> x = 'Hello' #现在又成了字符串>>> x = [1,2,3] #现在又成了列表
专业表述如下:
变量是一个系统表的元素,拥有指向对象的连接的空间
对象是被分配的一块内存,存储其所代表的值
引用是自动形成的从变量到对象的指针
特别注意: 类型属于对象,不是变量
比如像刚才的a=3, 整数对象3包含了两重信息
1.值为3
2.一个头部信息:告诉Pthyon,这是个整数对象[相当于一个指向int的指针]
共享引用: 比如说:
>>> a = 3>>> b = a**在运行赋值语句b = a之后,变量a和变量b指向了同一个对象的内存空间.**
从上图可以看到,a和b,其id完全一样,指向同一个整数对象3,或者说同一块内存
如果删掉a后, 不会影响b
拷贝概念的引入就是针对:可变对象的共享引用潜在的副作用而提出的.
【可变对象-不可变对象】
在Python中不可变对象指:一旦创建就不可修改的对象,包括字符串,元祖,数字
在Python中可变对象是指:可以修改的对象,包括:列表、字典
上面说的a,b都是整数,整数是不可变对象,如果是可变对象的话,就是另外一回事了。
>>> L1 = [2,3,4] #L1变量指向的是一个可变对象:列表 >>> L2 = L1 #将L1值赋给L2后,两者共享引用同一个列表对象【[1,2,3,4] >>> L1[0] = 200 #因为列表可变,改变L1中第一个元素的值 >>> L1; L2 #改变后,L1,L2同时改变,因为对象本身值变了 [200, 3, 4] [200, 3, 4] **```如果不想改变列表L2的值,有两种方法:切片 和 copy模块**
L1 = [2,3,4]
L2 = L1
id(L1);id(L2) #共享引用一个可变对象
45811784L
45811784L
L2 = L1[:] #切片操作
id(L1);id(L2) #切片后,对象就不一样了
45811784L
45806920L
L1[0] = 200
L1;L2 #L1发生改变,L2没有变化
[200, 3, 4]
[2, 3, 4]
“`
【拷贝】
1. 切片技术应用于所有的序列,包括:列表、字符串、元祖
但切片不能应用于字典。对字典只能使用D.copy()方法或D.deepcopy()方法.
深浅拷贝,即可用于序列,也可用于字典
import copy
X = copy.copy(Y) #浅拷贝:只拷贝顶级的对象,或者说:父级对象
X = copy.deepcopy(Y) #深拷贝:拷贝所有对象,顶级对象及其嵌套对象。或者说:父级对象及其子对象
【结论】
- 深浅拷贝copy()和deepcopy()
- 拷贝 copy()和deepcopy()
- python浅拷贝和深拷贝 copy()和deepcopy()
- Python里的拷贝【引用和copy(),deepcopy()的区别】
- 深浅拷贝:即Deep Copy和Shallow Copy的区别
- 理解copy和deepcopy
- 深拷贝deepcopy与浅拷贝copy
- iOS Copy 和 MutableCopy的区别 深浅拷贝的区别
- iOS Copy 和 MutableCopy的区别 深浅拷贝的区别
- 内存管理、copy、深浅拷贝
- python copy.copy和copy.deepcopy
- Python中的Copy和Deepcopy
- Python中的copy和deepcopy
- Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)
- toString()和深浅拷贝
- Python:浅拷贝与深拷贝copy.deepcopy()
- Python copy()与deepcopy()区别,深拷贝与浅拷贝
- python的深拷贝deepcopy与浅拷贝copy
- 机器学习(1)从基本术语开始
- Oracle:转换函数
- jvm中的垃圾收集器简介
- Codeforces Round #401 (Div. 2) E. Hanoi Factory 贪心+栈
- 二叉树排序
- 深浅拷贝copy()和deepcopy()
- PHP获取上周、本周、上月、本月、本季度、上季度时间方法大全
- Oracle:正则表达式函数
- DialogFragment中如何获取Activity中onActivityResult的返回信息
- 【深度学习论文】:U-Net
- 贪心问题集
- UML认识
- 配置postfix和dovecot启用SSL以加密连接
- U-BOOT源码目录