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实现比较两段文本不同之处的方法
May 30 Python
python实现爬取千万淘宝商品的方法
Jun 30 Python
Python求算数平方根和约数的方法汇总
Mar 09 Python
Python中字典(dict)合并的四种方法总结
Aug 10 Python
python并发编程之线程实例解析
Dec 27 Python
Python实现正则表达式匹配任意的邮箱方法
Dec 20 Python
python爬取酷狗音乐排行榜
Feb 20 Python
Python3.5集合及其常见运算实例详解
May 01 Python
对Pytorch神经网络初始化kaiming分布详解
Aug 18 Python
通过实例了解python property属性
Nov 01 Python
python查看矩阵的行列号以及维数方式
May 22 Python
详解python实现可视化的MD5、sha256哈希加密小工具
Sep 14 Python
python绘图subplots函数使用模板的示例代码
教你怎么用Python处理excel实现自动化办公
解决python绘图使用subplots出现标题重叠的问题
python数据库批量插入数据的实现(executemany的使用)
Apr 30 #Python
Python如何把不同类型数据的json序列化
Apr 30 #Python
python实现三次密码验证的示例
Django一小时写出账号密码管理系统
You might like
php小经验:解析preg_match与preg_match_all 函数
2013/06/29 PHP
php+flash+jQuery多图片上传源码分享
2020/07/27 PHP
PHPCMS V9 添加二级导航的思路详解
2016/10/20 PHP
PHP批量获取网页中所有固定种子链接的方法
2016/11/18 PHP
php 调用ffmpeg获取视频信息的简单实现
2017/04/03 PHP
PHP接入支付宝接口失效流程详解
2020/11/10 PHP
PHP7变量处理机制修改
2021/03/09 PHP
Javascript优化技巧(文件瘦身篇)
2008/01/28 Javascript
asp.net+jquery滚动滚动条加载数据的下拉控件
2010/06/25 Javascript
基于jQuery的一个扩展form序列化到json对象
2010/12/09 Javascript
JavaScript中的字符串操作详解
2013/11/12 Javascript
js中把JSON字符串转换成JSON对象最好的方法
2014/03/21 Javascript
详解基于Bootstrap扁平化的后台框架Ace
2015/11/27 Javascript
深入理解angularjs过滤器
2016/05/25 Javascript
原生javascript上传图片带进度条【实例分享】
2017/04/06 Javascript
Vue 通过自定义指令回顾v-内置指令(小结)
2018/09/03 Javascript
小程序云开发实战小结
2018/10/25 Javascript
解决layer 动态加载select 失效的问题
2019/09/18 Javascript
微信小程序商品详情页底部弹出框
2019/11/22 Javascript
Vue插槽_特殊特性slot,slot-scope与指令v-slot说明
2020/09/04 Javascript
python删除文件示例分享
2014/01/28 Python
Mac 上切换Python多版本
2017/06/17 Python
python matplotlib中文显示参数设置解析
2017/12/15 Python
网红编程语言Python将纳入高考你怎么看?
2018/06/07 Python
python2与python3的print及字符串格式化小结
2018/11/30 Python
PyQt5实现暗黑风格的计时器
2019/07/29 Python
美国旅游网站:Tours4Fun
2017/02/17 全球购物
世界上最大的铁人三项商店:Tri UK
2020/11/04 全球购物
移风易俗倡议书
2014/04/15 职场文书
人力资源管理专业自荐书
2014/07/07 职场文书
通知格式
2015/04/27 职场文书
2015年工商所工作总结
2015/05/21 职场文书
六五普法先进个人主要事迹材料
2015/11/03 职场文书
小学思品教学反思
2016/02/20 职场文书
SQL Server携程核心系统无感迁移到MySQL实战
2022/06/01 SQL Server