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接收多播数据的代码
Mar 01 Python
python实现同时给多个变量赋值的方法
Apr 30 Python
Python线程详解
Jun 24 Python
Python读取英文文件并记录每个单词出现次数后降序输出示例
Jun 28 Python
Python函数和模块的使用总结
May 20 Python
python函数的万能参数传参详解
Jul 26 Python
django foreignkey外键使用的例子 相当于left join
Aug 06 Python
Django自定义全局403、404、500错误页面的示例代码
Mar 08 Python
Django通过json格式收集主机信息
May 29 Python
python自动化测试三部曲之request+django实现接口测试
Oct 07 Python
全面介绍python中很常用的单元测试框架unitest
Dec 14 Python
python 三种方法提取pdf中的图片
Feb 07 Python
python绘图subplots函数使用模板的示例代码
教你怎么用Python处理excel实现自动化办公
解决python绘图使用subplots出现标题重叠的问题
python数据库批量插入数据的实现(executemany的使用)
Apr 30 #Python
Python如何把不同类型数据的json序列化
Apr 30 #Python
python实现三次密码验证的示例
Django一小时写出账号密码管理系统
You might like
Cappuccino 卡布其诺咖啡之制作
2021/03/03 冲泡冲煮
php巧获服务器端信息
2006/12/06 PHP
php zlib压缩和解压缩swf文件的代码
2008/12/30 PHP
php 操作符与控制结构
2012/03/07 PHP
smarty巧妙处理iframe中内容页的代码
2012/03/07 PHP
php使用百度ping服务代码实例
2014/06/19 PHP
PHP实现支持SSL连接的SMTP邮件发送类
2015/03/05 PHP
CI框架数据库查询缓存优化的方法
2016/11/21 PHP
工作中常用到的JS表单验证代码(包括例子)
2010/11/11 Javascript
IE中jquery.form中ajax提交没反应解决方法分享
2012/09/11 Javascript
使用js的replace()方法查找字符示例代码
2013/10/28 Javascript
JavaScript中反正弦函数Math.asin()的使用简介
2015/06/14 Javascript
利用HTML5的画布Canvas实现刮刮卡效果
2015/09/06 Javascript
使用jquery获取url以及jquery获取url参数的实现方法
2016/05/25 Javascript
Node.js中使用jQuery的做法
2016/08/17 Javascript
网页挂马方式整理及详细介绍
2016/11/03 Javascript
BootStrap与Select2使用小结
2017/02/17 Javascript
jQuery滚动插件scrollable.js用法分析
2017/05/25 jQuery
react中fetch之cors跨域请求的实现方法
2018/03/14 Javascript
微信小程序自定义菜单切换栏tabbar组件代码实例
2019/12/30 Javascript
python监控linux内存并写入mongodb(推荐)
2017/09/11 Python
Python实现简单的文本相似度分析操作详解
2018/06/16 Python
Python 2.7中文显示与处理方法
2018/07/16 Python
python实现逐个读取txt字符并修改
2018/12/24 Python
对python3中, print横向输出的方法详解
2019/01/28 Python
解决Python 异常TypeError: cannot concatenate 'str' and 'int' objects
2020/04/08 Python
英国高级健康和美容产品零售商:Life and Looks
2019/08/01 全球购物
Delphi CS笔试题
2014/01/04 面试题
优秀毕业生推荐信
2013/11/02 职场文书
晚归检讨书
2014/02/19 职场文书
连带责任保证书
2014/04/29 职场文书
党支部对转正的意见
2015/06/02 职场文书
小学入学感言
2015/08/01 职场文书
2016年学校招生广告语
2016/01/28 职场文书
MySQL 全文索引使用指南
2021/05/25 MySQL
JavaScript数组 几个常用方法总结
2021/11/11 Javascript