Python基础之赋值,浅拷贝,深拷贝的区别


Posted in Python onApril 30, 2021

一、赋值

不会开辟新的内存空间,只是复制了新对象的引用。所以当一个数据发生变化时,另外一个数据也会随之改变。

二、 浅拷贝

创建新对象,其内容是对原对象的引用。浅拷贝之所以称为浅拷贝,是因为它仅仅只拷贝了第一层,即只拷贝了最外层的对象本身,内部的元素都只是拷贝了一个引用而已,即内部元素如果被修改,则另外一个数据也会发生变化。

浅拷贝的三种形式:

A = [1, 2, 3, 4]
  • 切片操作
# 第1种
B = A[:]
# 第2种
B = [a for a in A]
  • 工厂函数
B = list(A)
  • copy函数
B = copy.copy(A)

浅拷贝要分两种情况进行讨论:

1)当浅拷贝的值是不可变对象(例如字符串、元组、数值类型)时,和赋值情况一样,对象的内存地址(id())与浅拷贝原来的值一致。

2)当浅拷贝的值是可变对象(例如列表、字典、集合等)时,也需要分两种情况讨论:

首先,原来值的内存地址与拷贝后的内存地址不同。

  • 当要拷贝的对象里面,没有可变的子对象时,原来值(拷贝值)的改变并不会影响拷贝值(原来值)。
  • 当要拷贝的对象里面,有可以改变的子对象时,改变该子对象,原来值和拷贝值之间会互相影响。

三、深拷贝

深拷贝拷贝出来的对象是一个全新的对象,和原来的对象没有任何的关联。改变原有对象不会影响新的拷贝对象。

四、例子

  • 不可变对象
import copy
# 不可变对象
# A = (1, 2, 'hello')   # 元组
# A = 1                 # 数值
A = 'hello'             # 字符串

print("********赋值********")
B = A
print(id(A))
print(id(B))
print(A)
print(B)

print("********浅拷贝********")
B = copy.copy(A)
print(id(A))
print(id(B))
print(A)
print(B)

print("********深拷贝********")
B = copy.deepcopy(A)
print(id(A))
print(id(B))
print(A)
print(B)

结果:

********赋值********
1894005658264
1894005658264
hello
hello
********浅拷贝********
1894005658264
1894005658264
hello
hello
********深拷贝********
1894005658264
1894005658264
hello
hello

  • 可变对象
import copy
# 可变对象
A = [1, 2, 3]

print("********赋值********")
B = A
print(id(A))
print(id(B))
print(A)
print(B)

print("********浅拷贝********")
B = copy.copy(A)
print(id(A))
print(id(B))
print(A)
print(B)

print("********深拷贝********")
B = copy.deepcopy(A)
print(id(A))
print(id(B))
print(A)
print(B)

结果:

********赋值********
1602694308360
1602694308360
[1, 2, 3]
[1, 2, 3]
********浅拷贝********
1602694308360
1602694308424
[1, 2, 3]
[1, 2, 3]
********深拷贝********
1602694308360
1602950316296
[1, 2, 3]
[1, 2, 3]

  • 可变对象修改外层
import copy
# 可变对象
A = [1, 2, 3, [11, 10, 20]]

# 可变对象的外层修改
B1 = A                   # 赋值
B2 = copy.copy(A)        # 浅拷贝
B3 = copy.deepcopy(A)    # 深拷贝
A.append(4)
print("********赋值********")

print(id(A))
print(id(B1))
print(A)
print(B1)

print("********浅拷贝********")
print(id(A))
print(id(B2))
print(A)
print(B2)

print("********深拷贝********")
print(id(A))
print(id(B3))
print(A)
print(B3)

结果:

********赋值********
2215309238856
2215309238856
[1, 2, 3, [11, 10, 20], 4]
[1, 2, 3, [11, 10, 20], 4]
********浅拷贝********
2215309238856
2215593496776
[1, 2, 3, [11, 10, 20], 4]
[1, 2, 3, [11, 10, 20]]
********深拷贝********
2215309238856
2215593518024
[1, 2, 3, [11, 10, 20], 4]
[1, 2, 3, [11, 10, 20]]

  • 可变对象修改内层
import copy
# 可变对象
A = [1, 2, 3, [11, 10, 20]]

# 可变对象的内层修改
B1 = A                   # 赋值
B2 = copy.copy(A)        # 浅拷贝
B3 = copy.deepcopy(A)    # 深拷贝
A[3].append(4)
print("********赋值********")

print(id(A))
print(id(B1))
print(A)
print(B1)

print("********浅拷贝********")
print(id(A))
print(id(B2))
print(A)
print(B2)

print("********深拷贝********")
print(id(A))
print(id(B3))
print(A)
print(B3)

结果

********赋值********
2288591069768
2288591069768
[1, 2, 3, [11, 10, 20, 4]]
[1, 2, 3, [11, 10, 20, 4]]
********浅拷贝********
2288591069768
2288847138760
[1, 2, 3, [11, 10, 20, 4]]
[1, 2, 3, [11, 10, 20, 4]]
********深拷贝********
2288591069768
2288847168264
[1, 2, 3, [11, 10, 20, 4]]
[1, 2, 3, [11, 10, 20]]

到此这篇关于Python基础之赋值,浅拷贝,深拷贝的区别的文章就介绍到这了,更多相关Python赋值 浅拷贝 深拷贝的区别内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
简单了解Python下用于监视文件系统的pyinotify包
Nov 13 Python
Python3 socket同步通信简单示例
Jun 07 Python
快速了解Python相对导入
Jan 12 Python
Python爬虫之pandas基本安装与使用方法示例
Aug 08 Python
使用python采集脚本之家电子书资源并自动下载到本地的实例脚本
Oct 23 Python
padas 生成excel 增加sheet表的实例
Dec 11 Python
pytorch绘制并显示loss曲线和acc曲线,LeNet5识别图像准确率
Jan 02 Python
详解pyinstaller生成exe的闪退问题解决方案
Jun 19 Python
Python openpyxl模块实现excel读写操作
Jun 30 Python
解决c++调用python中文乱码问题
Jul 29 Python
selenium+python实现基本自动化测试的示例代码
Jan 27 Python
python 递归相关知识总结
Mar 03 Python
python绘图subplots函数使用模板的示例代码
教你怎么用Python处理excel实现自动化办公
解决python绘图使用subplots出现标题重叠的问题
python数据库批量插入数据的实现(executemany的使用)
Apr 30 #Python
Python如何把不同类型数据的json序列化
Apr 30 #Python
python实现三次密码验证的示例
Django一小时写出账号密码管理系统
You might like
php str_pad 函数使用详解
2009/01/13 PHP
jQuery中将函数赋值给变量的调用方法
2012/03/23 Javascript
js的window.showModalDialog及window.open用法实例分析
2015/01/29 Javascript
js+css简单实现网页换肤效果
2015/12/29 Javascript
jquery跟随屏幕滚动效果的实现代码
2016/04/13 Javascript
值得分享的轻量级Bootstrap Table表格插件
2016/05/30 Javascript
jQuery Easyui加载表格出错时在表格中间显示自定义的提示内容
2016/12/08 Javascript
浅析Node.js非对称加密方法
2018/01/29 Javascript
nodejs遍历文件夹下并操作HTML/CSS/JS/PNG/JPG的方法
2018/11/01 NodeJs
在NPM发布自己造的轮子的方法步骤
2019/03/09 Javascript
11个教程中不常被提及的JavaScript小技巧(推荐)
2019/04/17 Javascript
详解关于React-Router4.0跳转不置顶解决方案
2019/05/10 Javascript
浅谈Vue.set实际上是什么
2019/10/17 Javascript
JavaScript Tab菜单实现过程解析
2020/05/13 Javascript
Openlayers+EasyUI Tree动态实现图层控制
2020/09/28 Javascript
[38:39]完美世界DOTA2联赛循环赛 IO vs GXR BO2第二场 11.04
2020/11/05 DOTA
Python通过poll实现异步IO的方法
2015/06/04 Python
Python 含参构造函数实例详解
2017/05/25 Python
对numpy Array [: ,] 的取值方法详解
2018/07/02 Python
django query模块
2019/04/20 Python
python启动应用程序和终止应用程序的方法
2019/06/28 Python
使用OpenCV实现仿射变换—平移功能
2019/08/29 Python
python程序 线程队列queue使用方法解析
2019/09/23 Python
python中栈的原理及实现方法示例
2019/11/27 Python
python读取hdfs上的parquet文件方式
2020/06/06 Python
详解在Python中使用Torchmoji将文本转换为表情符号
2020/07/27 Python
使用CSS Grid布局实现网格的流动
2014/12/30 HTML / CSS
Tory Burch德国官网:美国时尚生活品牌
2018/01/03 全球购物
世界上获奖最多的手机镜头:Olloclip
2018/03/03 全球购物
乌克兰在线电子产品商店:MTA
2019/11/14 全球购物
销售人员求职的自我评价分享
2014/03/15 职场文书
治安消防安全责任书
2014/07/23 职场文书
优秀班主任事迹材料
2014/12/16 职场文书
手术室消毒隔离制度
2015/08/05 职场文书
2019毕业论文致谢词
2019/06/24 职场文书
一篇文章带你深入了解Mysql触发器
2021/08/02 MySQL