首页 > 编程语言 >python学习——【第十一弹】

python学习——【第十一弹】

时间:2023-02-21 21:31:36浏览次数:61  
标签:python computer1 元素 第十一 学习 对象 print 拷贝 id

前言

上一篇文章  ​​python学习——【第十弹】​​中介绍了python中类的相关属性和方法,这篇文章接着学习 python中的浅拷贝,下一篇文章为大家介绍深拷贝。

简单了解

浅拷贝 : python拷贝一般都是浅拷贝,拷贝时,对象包含的子对象内容不拷贝,因此原对象与拷贝对象会引用同一个子对象。

浅拷贝

我们用列表(可变序列)来实现浅拷贝:

a=[11,22,33,[1,2,3,[4,5]]]
print('----------------a的相关信息-------------')
print(a) #[11, 22, 33, [1, 2, 3, [4, 5]]]
print('--------------a中元素的相关信息------------')
print(a[0],id(a[0]),a[1],id(a[1]),a[2],id(a[2]))
# 11 140720873268328 22 140720873268680 33 140720873269032
print('---------列表a中的列表元素的信息------------')
print(a[0],id(a[0]))
print(a[3],id(a[3]))
print(a[3][0],id(a[3][0]))
'''
11 140720873268328
[1, 2, 3, [4, 5]] 2219036188928
1 140720873268008
'''

对a进行浅拷贝:

# 将 a 进行浅拷贝
c=a.copy()
print('----------------c的相关信息----------------')
print(c) #[11, 22, 33, [1, 2, 3, [4, 5]]]
print('-----------------c中的元素的相关信息----------')
print(c[0],id(a[0]),c[1],id(c[1]),c[2],id(c[2]))
# 11 140720873268328 22 140720873268680 33 140720873269032
print('-----------列表c中的列表元素的相关信息------------')
print(c[0],id(c[0]))
print(c[3],id(c[3]))
print(c[3][0],id(c[3][0]))
'''
11 140720873268328
[1, 2, 3, [4, 5]] 2219036188928
1 140720873268008
'''

对浅拷贝后产生的对象的浅层元素和深层元素进行更改:

c[2]=10 #浅层元素
print(a,a[2],id(a[2])) #[11, 22, 33, [1, 2, 3, [4, 5]]] 33 140720873269032
c[3][0]=99 #深层元素
print(a,a[3][0],id(a[3][0])) #[11, 22, 33, [99, 2, 3, [4, 5]]] 99 140720873271144


可以发现,浅拷贝只拷贝浅层元素,深层元素的内存地址不改变;当对拷贝产生的新的对象的浅层元素进行更改时,原对象的主元素不做改变;但是对拷贝后产生的对象的深层对象进行改变时,那么原对象的深层元素的地址就会发生变化。

对于列表浅拷贝的示意图:

python学习——【第十一弹】_python

类的浅拷贝

通过举列表浅拷贝的例子我们不难发现,浅拷贝拷贝的是对象的主元素,即会产生一个指向新的地址的主元素;而子元素不会发生拷贝,因此依然和原来对象指向的地址相同。

那么接下来我们看一下类的浅拷贝的运用:

# 变量赋值和浅拷贝
class CPU():
pass

class Disk():
pass
class Computer():
# 初始化方法
def __init__(self,cpu,disk):
self.cpu=cpu
self.disk=disk
cpu1=CPU()
cpu2=cpu1
print(cpu1,id(cpu1),type(cpu1))
print(cpu2,id(cpu2),type(cpu2))
'''
<__main__.CPU object at 0x7f883d4d5cd0> 140223120760016
<__main__.CPU object at 0x7f883d4d5cd0> 140223120760016
'''
disk1=Disk()
print('disk1的信息',disk1,id(disk1),type(disk1))
computer1=Computer(cpu1,disk1)
print('computer1的信息',computer1,id(computer1),type(computer1))
# 浅拷贝
import copy
computer2=copy.copy(computer1)
print(computer1,id(computer1),computer1.cpu,computer1.disk)
print(computer2,id(computer2),computer2.cpu,computer2.disk)
'''
浅拷贝中子对象即原类的实例对象的子对象(computer1.cpu computer1.disk)不拷贝 因此拷贝之后的computer2的参数cpu 和 disk 的内存地址也是指向原来computer1的cpu 和 disk所指向的内存地址的 但是 computer1这个实例对象发生拷贝 也就是产生了一个computer2这个新对象 这个新对象指向的id地址也和原对象的不同
<__main__.Computer object at 0x7f883d4d5d50> <__main__.CPU object at 0x7f883d4d5cd0> <__main__.Disk object at 0x7f883d4d5d10>
<__main__.Computer object at 0x7f883d4d5ed0> <__main__.CPU object at 0x7f883d4d5cd0> <__main__.Disk object at 0x7f883d4d5d10>
'''

python学习——【第十一弹】_深拷贝_02

图解过程:

python学习——【第十一弹】_3d_03

每篇一语

工欲善其事,必先利其器!

如有不足,感谢指正!

标签:python,computer1,元素,第十一,学习,对象,print,拷贝,id
From: https://blog.51cto.com/u_15928170/6077077

相关文章

  • Linux学习-DAY11
    7.2LVM逻辑卷管理器LVM是Linux系统用于对硬盘分区进行管理的一种机制,理论性较强,其创建初衷是为了解决硬盘设备在创建分区后不易修改分区大小的缺陷。尽管对传统的硬盘分区进......
  • Django学习笔记记录(整理了B站武老师的讲课课件,供大家学习)
    day1、初识DjangoPython知识点:函数、面向对象。前端开发:HTML、CSS、JavaScript、jQuery、BootStrap。MySQL数据库。Python的Web框架:Flask,自身短小精悍+第三方组......
  • Johnson 全源最短路 学习笔记
    我居然不会这玩意,过来学一下。算法简介Johnson全源最短路用于求一个带负权的图的任意两点之间的最短路,时间复杂度为\(\Theta(nm\logm)\)。算法流程考虑到\(n\)次......
  • 对比学习简记
    目录Self-SupervisedLearning的核心思想两大主流方法实践应用ContrastiveRepresentationLearning对比学习目标函数ContrastiveLossTripletLossN-pairLossNCEInfoNCE......
  • docker学习
    1.背景打算装虚拟机,嫌麻烦,想到docker也可以实现,所以在本地部署docker2.docker和虚拟机的区别linux环境安装docker和制作镜像win11环境安装docker和制作镜像......
  • 学习进度
    今天完成了对android入门的学习,用了2小时的时间。我知道了什么是安卓开发,并安装了Androidstudio编译器,知道了什么是线性布局,需要把原有的布局删掉,重新写一个布局,并且了解了......
  • 2023.2.21 我的第一篇博客——软件工程学习心得体会
    今天是我第一次在博客园写博客,本人目前是上海海洋大学软件工程系大二在读,第一篇博客就聊聊我这一年半对软件工程学习的感想吧。编程语言方面,大一学习了C和C++,大二上学期学......
  • 2月21日javaweb学习之MyBatis
    MyBatis是一款优秀的持久层框架,所谓持久层就是负责将数据保存到数据库的那一层代码。(1)MyBatis快速入门,查询user表中所有的数据1.创建user表,添加数据2.创建模块,导入坐标......
  • 学习记录(2.21)
    今天总共学习了7h,感觉是收获颇丰的一天。其中1.5h跟外教激情对线,学习了如何正规且不失优雅的自我介绍,为CET4的口语考试奠定了一部分基础。之后的2.5h在学习和复习数据库的......
  • python和pycharm的安装与使用
    Python如何下载与安装?最新版本不具备最好的兼容性与稳定性 系统解释器建议一个版本的就行 建议安装3.7-3.10之间的版本 安装时注意你的操作系统的位数64位操作系......