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 实现归并排序算法
Jun 05 Python
Python中字典创建、遍历、添加等实用操作技巧合集
Jun 02 Python
python函数装饰器用法实例详解
Jun 04 Python
Python冲顶大会 快来答题!
Jan 17 Python
python 拷贝特定后缀名文件,并保留原始目录结构的实例
Apr 27 Python
Python基于jieba库进行简单分词及词云功能实现方法
Jun 16 Python
Python 查找list中的某个元素的所有的下标方法
Jun 27 Python
python三方库之requests的快速上手
Mar 04 Python
如何在Django项目中引入静态文件
Jul 26 Python
Django多数据库的实现过程详解
Aug 01 Python
python 数据生成excel导出(xlwt,wlsxwrite)代码实例
Aug 23 Python
pandas DataFrame 数据选取,修改,切片的实现
Apr 24 Python
python绘图subplots函数使用模板的示例代码
教你怎么用Python处理excel实现自动化办公
解决python绘图使用subplots出现标题重叠的问题
python数据库批量插入数据的实现(executemany的使用)
Apr 30 #Python
Python如何把不同类型数据的json序列化
Apr 30 #Python
python实现三次密码验证的示例
Django一小时写出账号密码管理系统
You might like
PHP中is_file不能替代file_exists的理由
2014/03/04 PHP
如何判断php mysqli扩展类是否开启
2016/12/24 PHP
jQuery对表单元素的取值和赋值操作代码
2011/05/19 Javascript
jQuery 数据缓存模块进化史详细介绍
2012/11/19 Javascript
SeaJS入门教程系列之使用SeaJS(二)
2014/03/03 Javascript
node-webkit打包成exe文件被360误报木马的解决方法
2015/03/11 Javascript
javascript基本算法汇总
2016/03/09 Javascript
js小数计算小数点后显示多位小数的实现方法
2016/05/30 Javascript
js轮盘抽奖实例分析
2020/04/17 Javascript
jquery获取input type=text中的值的各种方式(总结)
2016/12/02 Javascript
JS实现评价的星星功能
2017/08/20 Javascript
浅析Vue自定义组件的v-model
2017/11/26 Javascript
mpvue构建小程序的方法(步骤+地址)
2018/05/22 Javascript
bootstrap 路径导航 分页 进度条的实例代码
2018/08/06 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【凹多边形的分离轴检测算法】
2018/12/13 Javascript
详解Vue中的scoped及穿透方法
2019/04/18 Javascript
vue在线动态切换主题色方案
2020/03/26 Javascript
解决Vue keep-alive 调用 $destory() 页面不再被缓存的情况
2020/10/30 Javascript
[03:11]2014DOTA2国际邀请赛-VG掉入败者组 独家专访357
2014/07/19 DOTA
Python读写配置文件的方法
2015/06/03 Python
Python pass详细介绍及实例代码
2016/11/24 Python
使用Python通过win32 COM实现Word文档的写入与保存方法
2018/05/08 Python
Python logging模块用法示例
2018/08/28 Python
python实现简单的单变量线性回归方法
2018/11/08 Python
茵宝(Umbro)英国官方商店:英国足球服装生产商
2016/12/29 全球购物
英国马莎百货印度官网:Marks & Spencer印度
2020/10/08 全球购物
ajax是什么及其工作原理
2012/02/08 面试题
英语文学专业学生的自我评价
2013/10/31 职场文书
出纳员岗位职责风险
2014/03/06 职场文书
毕业评语大全
2014/05/04 职场文书
干部竞争上岗演讲稿
2014/09/11 职场文书
2015年乡镇统计工作总结
2015/04/22 职场文书
停发工资证明范本
2015/06/12 职场文书
小学运动会入场词
2015/07/18 职场文书
2019年暑期安全广播稿!
2019/07/03 职场文书
python微信智能AI机器人实现多种支付方式
2022/04/12 Python