Python深浅copy
在python里对对象进行拷贝有三个,即赋值,深拷贝,浅拷贝。而对象又分为两种,一种是不可变对象(字符串、元组、数字 ),一种是可变对象(列表、字典)。而深浅拷贝有三种情况:
- 拷贝的是不可变对象,对于不可变对象来说,深浅拷贝都一样的,即便是用深拷贝,也都是一样的id,如果要重新赋值,也只是创建一个新的对象,替换旧的对象。所以对于不可变对象来说,不管怎么拷贝,它的地址、值都是一样的。
- 拷贝的是可变对象
import copy
a=3
b=copy.copy(3)
c=copy.deepcopy(3)
print(a,b,c) #3,3,3,
print(id(a)==id(b)==id(c)) #true
- 拷贝的可变对象里面还有子对象
import copy
a=[1,2,3,[4,5,6]]#1,2,3 是第一层,[4,5,6]是第二层
b=a
c=copy.copy(a)#当浅copy的时候,第一层是新的,第二层还是原来的地址
d=copy.deepcopy(a)#当用深copy的时候,所有的内容都是新的,所以不会影响地址print(id(a)==id(b)) #true
print(id(a)==id(c)) #false
print(id(a)==id(d)) #false
print(id(c)==id(d)) #false
下面用栈和堆来解释这个深浅copy。
1.下面的程序是一个简单的把赋值相等的函数
c=[1,2,3]
d=c
c[0]=100
print(c==d) #true
用栈和堆是如下图:
这是是一个简单把c的值赋给d,就是把c在栈中存放[1,2,3,]在堆中的地址传给d。
2.浅copy的程序如下
import copy
a=[1,2,3]
b=copy.copy(a)
a[0]=100
print(a==b) #flase
用栈和堆的图形表示为
浅拷贝只是把【1,2,3】的值在堆里重新开辟的内存把【1,2,3,】放进去,b在栈里存放的【1,2,3】在堆里的地址和a在栈里存放的【1,2,3,】在堆里的地址是两个完全不同的地址。
a 的值得变换不回影影响b的值
如果是嵌套列表,在浅copy里,嵌套列表值改变会影响复制的值
import copy
a=[[1,2],3,4]
b=copy.copy(a)
a[0][0]=100
print(b) #[[100,2],3,4]
用栈和堆的图示来表示的入下图:
b只是copy了【0xf001,3,4】,但是没有copy【1,2】,所以【1,2】在堆里的地址还是原地址,所以1换成100,b的值也是[[100,2],3,4]
当浅copy的时候,第一层是新的,第二层还是原来的地址。
3.深copy:
import copy
a=[1,2,[3,4]]
b=copy.deepcopy(a)
a[2][0]=300
print(a) # [1, 2, [300, 4]]
print(b) #[1, 2, [3, 4]]
输出结果a=[1, 2, [300, 4]], b=[1, 2, [3, 4]]
具体如下图:
当用深copy的时候,所有的地址都是新的,所以不会影响地址,所以a[2][0]的改变不会影响b[2][0]的值改变,因为堆地址完全不一样。
Python深浅copy相关推荐
- Python 深浅copy 和文件操作
深浅copy 1,先看赋值运算. l1 = [1,2,3,['barry','alex']] l2 = l1l1[0] = 111 print(l1) # [111, 2, 3, ['barry', ...
- Python基础三--字典,集合,编码,深浅copy,元祖、文件操作
字典 dict数据类型划分:可变数据类型,不可变数据类型不可变数据类型: 元组,bool值,int,str 可哈希可变数据类型: list,dict,set 不可哈希 dict key :必须是不可变 ...
- python怎么设置颜色深浅变化_Python赋值、深浅copy
Python赋值.深浅copy assignment: 在 Python 中,对象的赋值就是简单的对象引用,这点和 C++不同,如下所示 a = [1, 2, 'hello', ['python', ...
- python 的内存回收,及深浅Copy详解
一.python中的变量及引用 1.1 python中的不可变类型: 数字(num).字符串(str).元组(tuple).布尔值(bool<True,False>) 接下来我们讲完后你就 ...
- [转载] python创建集合、计算a|b_python之路(集合,深浅copy,基础数据补充)
参考链接: Python 集合set | symmetric_difference 一.集合:类似列表,元组的存储数据容器,不同点是不可修改,不可重复.无序排列. 1.创建集合: (1).set1 = ...
- 乐学python怎么样_铁乐学Python_day07_集合and浅谈深浅copy
1.[List补充] 在循环一个列表时,最好不要使用元素和索引进行删除操作,一旦删除,索引会随之改变,容易出错. 如果想不出错,可以采用倒着删除的方法,因为倒着删除进行的话,只是后面元素的位置发生了变 ...
- python之深浅copy
python之深浅copy 文章目录 python之深浅copy 引入 1.为什么要使用深浅拷贝 一.赋值运算 1.赋值运算原理 2.示例 3.总结 二.拷贝 三.浅拷贝 什么是浅拷贝? 1.浅拷贝原 ...
- python拷贝文件函数_python笔记2小数据池,深浅copy,文件操作及函数初级
小数据池就是在内存中已经开辟了一些特定的数据,经一些变量名直接指向这个内存,多个变量间公用一个内存的数据. int: -5 ~ 256 范围之内 str: 满足一定得规则的字符串. 小数据池: 1,节 ...
- python中的深浅copy
深浅copy 复制,首先我们从切片技术说起.它应用于所有的序列,包括:列表,字符串,元祖.但是切片不能应用于字典,对于字典只能使用D.copy() 和 D.deepcopy()方法. 下面具体说一下深 ...
最新文章
- php 如何利用 soap调用.Net的WebService asmx文件
- Hyper-V备份:选择Hypervisor备份还是虚拟机备份
- mysql core 文件_MySQL未能加载文件或程序集“Ubiety.Dns.Core”或它的某一个依赖项 问题的解决...
- 百度二次上市涨0.79%,错过移动互联网热潮后牌怎么出?
- JeecgBoot 移动OA 新版本出炉,速度体验!!!
- signature=fa342ee2b7c3e3e9cba3f194df2d59ca,Date of Signature
- codevs 1052 地鼠游戏
- POJ 3421 X-factor Chains
- 【DFS】LeetCode 51. N-Queens
- ASP.Net中防止页面刷新重复提交的几种方法
- WPE教程 传奇神秘商店外挂制作
- macOS 锐捷校园网解决方案
- 捷联惯导系统学习4.3(静基座误差)
- 【艾特淘】淘宝流量黄金标题的制作方法本
- 如何用matlab求向量在基下的坐标,请问什么是有关向量的基底、基向量、基坐标?...
- 硬盘分区表错误与解决办法
- 图像艺术风格化 Neural-Style
- 李白藏头诗鸿蒙,女子示爱的诗词
- 网易2017实习生招聘面试经历
- Spring集成Activemq使用