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中使用pyhook实现键盘监控的例子
Jul 18 Python
Python检测生僻字的实现方法
Oct 23 Python
Python 文件操作的详解及实例
Sep 18 Python
PyCharm 常用快捷键和设置方法
Dec 20 Python
使用python编写简单的小程序编译成exe跑在win10上
Jan 15 Python
python2.7 json 转换日期的处理的示例
Mar 07 Python
Python 调用PIL库失败的解决方法
Jan 08 Python
初探利用Python进行图文识别(OCR)
Feb 26 Python
使用python动态生成波形曲线的实现
Dec 04 Python
python获取本周、上周、本月、上月及本季的时间代码实例
Sep 08 Python
Python数据分析之pandas函数详解
Apr 21 Python
如何用python绘制雷达图
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中文件缓存转内存缓存的方法
2011/12/06 PHP
解析posix与perl标准的正则表达式区别
2013/06/17 PHP
PHP JSON出错:Cannot use object of type stdClass as array解决方法
2014/08/16 PHP
php生成随机颜色的方法
2014/11/13 PHP
解决yii2左侧菜单子级无法高亮问题的方法
2016/05/08 PHP
JavaScript 原型链学习总结
2010/10/29 Javascript
jquery parent和parents的区别分析
2013/10/02 Javascript
详解JavaScript中Date.UTC()方法的使用
2015/06/12 Javascript
浅谈jQuery中setInterval()方法
2015/07/07 Javascript
js实现汉字排序的方法
2015/07/23 Javascript
Vue项目数据动态过滤实践及实现思路
2018/09/11 Javascript
一步快速解决微信小程序中textarea层级太高遮挡其他组件
2019/03/04 Javascript
微信内置开发 iOS修改键盘换行为搜索的解决方案
2019/11/06 Javascript
Vue解析剪切板图片并实现发送功能
2020/02/04 Javascript
深入解读VUE中的异步渲染的实现
2020/06/19 Javascript
python matplotlib坐标轴设置的方法
2017/12/05 Python
python模拟表单提交登录图书馆
2018/04/27 Python
python采集微信公众号文章
2018/12/20 Python
把django中admin后台界面的英文修改为中文显示的方法
2019/07/26 Python
Python log模块logging记录打印用法解析
2020/01/20 Python
Python字典dict常用方法函数实例
2020/11/09 Python
Python将list元素转存为CSV文件的实现
2020/11/16 Python
Pandas对每个分组应用apply函数的实现
2020/12/13 Python
世界上最值得信赖的多日游在线市场:TourRadar
2018/07/20 全球购物
如何进行Linux分区优化
2013/02/12 面试题
学习优秀党员杨宗兴先进事迹材料思想汇报
2014/09/14 职场文书
向国旗敬礼活动总结
2014/09/27 职场文书
个人整改措施书面材料
2014/10/24 职场文书
2014年行政人事工作总结
2014/12/09 职场文书
培养联系人考察意见
2015/06/01 职场文书
八月迷情观后感
2015/06/11 职场文书
Redis分布式锁Redlock的实现
2021/08/07 Redis
C#连接ORACLE出现乱码问题的解决方法
2021/10/05 Oracle
uni-app 微信小程序授权登录的实现步骤
2022/02/18 Javascript
PostgreSQL 插入INSERT、删除DELETE、更新UPDATE、事务transaction
2022/04/12 PostgreSQL
Python自动化实战之接口请求的实现
2022/05/30 Python