python深复制_Python深浅拷贝
前言
Python的数据类型:
不可变数据类型:数值类型(int、float)、字符串、元组
可变数据类型:列表、字典、集合
深浅copy的模块(copy):
copy.copy() 浅拷贝
copy.deepcopy() 深拷贝
不可变数据类型的深浅拷贝
浅拷贝
#!/usr/bin/env python
# -*-coding:utf-8-*-
"""
@author:fyh
@time:2019/6/5
"""
import copy
a = 123
b = copy.copy(a)
print(b)
print(id(a))
print(id(b))
# 输出结果
# 123
# 1891531600
# 1891531600
s1 = "abc"
s2 = copy.copy(s1)
print(s2)
print(id(s1))
print(id(s2))
# 输出结果
# abc
# 2586689354584
# 2586689354584
通过上面的示例可以看出:不可变类型进行浅拷贝不会给拷贝的对象开辟新的内存空间,而只是拷贝了这个对象的引用。
深拷贝
#!/usr/bin/env python
# -*-coding:utf-8-*-
"""
@author:fyh
@time:2019/6/5
"""
import copy
a = 123
b = copy.deepcopy(a)
print(b)
print(id(a))
print(id(b))
# 输出结果
# 123
# 1891531600
# 1891531600
s1 = "abc"
s2 = copy.deepcopy(s1)
print(s2)
print(id(s1))
print(id(s2))
# 输出结果
# abc
# 2586689354584
# 2586689354584
通过上面的示例可以看出:不可变类型进行深拷贝不会给拷贝的对象开辟新的内存空间,也是拷贝了这个对象的引用。
原理如下图:
可变类型的深浅拷贝
浅拷贝
#!/usr/bin/env python3
"""
@author:fyh
"""
import copy
my_list1 = ['苹果', '鸭梨']
my_list2 = copy.copy(my_list1)
print("my_list1:", id(my_list1), "my_list2:", id(my_list2))
my_list1[0] = '香蕉'
print(my_list1, my_list2)
# 结果
# my_list1: 140246877880712 my_list2: 140246877802120
# ['香蕉', '鸭梨'] ['苹果', '鸭梨']
# 结论:对可变类型可以进行浅拷贝,会对对象开辟新的内存空间
my_list3 = ['苹果', '鸭梨', ['橘子', '橙子']]
my_list4 = copy.copy(my_list3)
print("my_list3:", id(my_list3), "my_list4:", id(my_list4))
# 结果 my_list3: 140703644308360 my_list4: 140703644310728
print("my_list3[2]:", id(my_list3[2]), "my_list4[2]:", id(my_list4[2]))
# 结果:my_list3[2]: 140309865347272 my_list4[2]: 140309865347272
my_list3[2][0] = '凤凰'
print("my_list3", my_list3, "my_list4", my_list4)
# 结果:my_list3 ['苹果', '鸭梨', ['凤凰', '橙子']] my_list4 ['苹果', '鸭梨', ['凤凰', '橙子']]
my_list3[0] = "aa"
print("my_list3", my_list3, "my_list4", my_list4)
# 结果:my_list3 ['aa', '鸭梨', ['凤凰', '橙子']] my_list4 ['苹果', '鸭梨', ['凤凰', '橙子']]
# 结论:浅拷贝只会对对象的第一层对象进行拷贝
结论:copy函数是浅拷贝,只对可变类型的第一层对象进行拷贝,对拷贝的对象开辟新的内存空间进行存储,不会拷贝对象内部的子对象。
原理如下:
未修改前:
修改后的:
深拷贝
#!/usr/bin/env python3
"""
@author:fyh
"""
import copy
list1 = [1, 2]
list2 = copy.deepcopy(list1)
print("list1", id(list1), "list2", id(list2))
# 结果:list1 140200541024008 list2 140200540991112
list1[0] = 3
print(list1, list2)
# 结果:[3, 2] [1, 2]
list3 = [3, 4, [5, 6]]
list4 = copy.deepcopy(list3)
print("list3", id(list3), "list4", id(list4))
# 结果:list3 140370543248904 list4 140370543250184
print("list3[2]", id(list3[2]), "list4[2]", id(list4[2]))
# print("list3", id(list3), "list4", id(list4))
list3[2][0] = 7
print(list3, list4)
# 结果:[3, 4, [7, 6]] [3, 4, [5, 6]]
结论:可变类型进行深拷贝会对该对象到最后一个可变类型的每一层对象就行拷贝, 对每一层拷贝的对象都会开辟新的内存空间进行存储。
原理如下图:
总结
浅拷贝使用copy.copy函数
深拷贝使用copy.deepcopy函数
不管是给对象进行深拷贝还是浅拷贝,只要拷贝成功就会开辟新的内存空间存储拷贝的对象。
浅拷贝和深拷贝的区别是:
浅拷贝最多拷贝对象的一层,深拷贝可能拷贝对象的多层
python深复制_Python深浅拷贝相关推荐
- python深复制浅复制_Python复制–深层复制
python深复制浅复制 Today we will learn about Python copy class. We will also learn about shallow copy, dee ...
- python自动复制输出_python 深浅拷贝集合
一.深浅拷贝 1.浅拷贝,只会拷贝第一层 s = [1, 'ss', '小可爱'] s1=s.copy()print(s1) >>> [1, 'ss', '小可爱'] s = [1, ...
- python深复制与浅复制_Python中的深拷贝和浅拷贝详解
要说清楚Python中的深浅拷贝,需要搞清楚下面一系列概念: 变量-引用-对象(可变对象,不可变对象)-切片-拷贝(浅拷贝,深拷贝) [变量-对象-引用] 在Python中一切都是对象,比如说:3, ...
- python list 深复制_Python列表的深复制和浅复制示例详解
免费资源网,https://freexyz.cn/ 一.深复制与浅复制 列表是Python中自带的一种数据结构,在使用列表时,拷贝操作不可避免,下面简单讨论一下列表的深复制(拷贝)与浅复制 首先看代码 ...
- python copy函数用法_Python深浅拷贝
预备知识一--python的变量及其存储 在详细的了解python中赋值.copy和deepcopy之前,我们还是要花一点时间来了解一下python内存中变量的存储情况. 在高级语言中,变量是对内存及 ...
- python浅复制与深复制_Python中的浅复制与深复制
python浅复制与深复制 In python, the assignment operator does not copy the objects, instead, they create bin ...
- js中的深浅复制(深浅拷贝、深浅克隆)
什么是浅复制? --把一个变量赋值给另一个变量,基本数据类型如数字,字符串,布尔值等这些是拷贝值,引用数 据类型如对象,数组,函数等,这些拷贝的是地址. 深复制: 将一个对象从内存中完整的拷贝一份出来 ...
- Python collection模块与深浅拷贝
collection模块是对Python的通用内置容器:字典.列表.元组和集合的扩展,它包含一些专业的容器数据类型: Counter(计数器):dict子类,用于计算可哈希性对象的个数. Ordere ...
- python神坑系列之深浅拷贝
深浅拷贝 1.注意在拷贝中只有使用了.deepcopy方法才能进行深度拷贝!其余的一律是浅拷贝 #深拷贝import copy lst = copy.deepcopy(lst1) 浅拷贝: 拷贝的是第 ...
- 【Python基础】之深浅拷贝
1.首先介绍一个python的内置函数id() id()可以查看传入对象在内存中的地址. 在python中,对一些常用的数字或字符串,虽然变量名不同,但是为了节省内存,通常会共享同一个地址,如下代码示 ...
最新文章
- mongoengine中queryset触发网络访问机制剖析
- Oracle创建序列,删除序列,得到序列的例子
- mysql五-1:单表查询
- PCA对特征点描述子降维
- Seq(HDU-6672)
- 利用循环神经网络生成唐诗_可视化解释11种基本神经网络架构
- python小屋_1000道Python题库系列分享九(31道)
- 52 - 算法- leetcode 14 最长公共前缀
- esxi5.1 添加vSwitch,转VM network to new vSwitch
- 什么是今日头条下拉词下拉框?
- STM32:位带操作分析
- 文件打包,下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件
- Win下Eclipse提交hadoop程序出错:org.apache.hadoop.security.AccessControlException: Permission denied: user=
- NWT内斗:为了还不值钱的股份
- SpringBoot中的Aop优先使用的是JDK动态代理还是Cglib
- Linux下Oracle数据库的启动过程、关闭过程
- 基于LQR的车辆LKA算法设计
- recovery 工作流程
- 艺无止境·一路前行——王玉玺先生作品欣赏
- 8051单片机Proteus仿真与开发实例-光敏电阻+ADC0804仿真
热门文章
- Julia: [1 +j] ==[1 + j] ?
- 阿里云丁宇:阿里巴巴15年云原生实践
- 程序员误删,暂时不用离职了…… | 凌云时刻
- 3月21日阿里云北京峰会的注册二维码
- 【优化算法】龙格-库塔优化算法【含Matlab源码 1799期】
- 【元胞自动机】基于matlab元胞自动机单边教室疏散【含Matlab源码 1207期】
- 【PID优化】基于matlab粒子群算法PID控制器优化设计【含Matlab源码 1122期】
- 【图像融合】基于matlab GUI小波变换可见光与红外光图像融合(带面板)【含Matlab源码 701期】
- 【优化算法】符号LMS算法【含Matlab源码 697期】
- 【数据分析】基于matlab GUI kmeans聚类分组系统【含Matlab源码 510期】