python学习之【浅拷贝】

news2025/1/20 17:09:47

前言

上一篇文章,python学习之【继承、封装、多态】主要学习了面向对象的三大特征。这篇文章记录下对python的浅拷贝的学习,下一篇文章接着学习深拷贝。

在这里插入图片描述

简单了解

浅拷贝:python拷贝一般都是浅拷贝,拷贝时,对象包含的子对象内容不拷贝,因此,原对象与拷贝对象会引用同一个子对象(如果不好理解的话,可以接着往下看两张图)

浅拷贝

我们可以通过列表(可变序列)实现浅拷贝,首先我们创建一个列表a,然后将列表a的id地址以及其浅层元素和深层元素的id地址打印出来:

在这里插入图片描述

对列表a进行浅拷贝:

在这里插入图片描述
由这两张图可以发现,当对列表a进行浅拷贝的时候,列表a指向的内存地址是不改变的(即浅拷贝后产生的对象和原对象都是指向的同一个内存地址);并且无论是原对象列表a的浅层元素还是深层元素,它们拷贝前后都是指向的同一个内存地址。

接着,我们对浅拷贝后产生的对象的浅层元素和深层元素进行更改:

对浅拷贝后产生的对象的浅层元素进行更改
在这里插入图片描述
对浅拷贝后产生的对象的深层元素进行更改

在这里插入图片描述

对于列表浅拷贝和深拷贝的示意图(Pythontutor可视化代码工具):

在这里插入图片描述
这里我参考了一个视频讲解,觉得不错,分享给大家~点此查看。

由此,我们可以对浅拷贝做一个小结:

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

类的浅拷贝

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

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

# 变量赋值和浅拷贝
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>
'''

在这里插入图片描述
图解过程:
在这里插入图片描述

每篇一语

工欲善其事,必先利其器。
如有不足,感谢指正!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/813270.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C语言】函数重难点之函数递归

大家好&#xff0c;我是深鱼~ 目录 一、函数递归知识讲解 1.什么是递归&#xff1f; 2.递归的两个必要条件 2.1练习1&#xff1a; 2.2练习2&#xff1a; 二、递归与迭代 2.1练习3 2.2练习4 一、函数递归知识讲解 1.什么是递归&#xff1f; 程序调用自身的编程技巧称为…

UNITY随记(八) SHADER实现立方体CUBE显示边框,描边

Shader "Vitens/CubeOutline"{Properties{_Color("Color", color) = (1,1,1,1)_Width("Width", range(0,0.5)) = 0.1}SubShader{Tags {"Queue"=

windows下载安装FFmpeg

FFmpeg是一款强大的音视频处理软件&#xff0c;下面介绍如何在windows下下载安装FFmpeg 下载 进入官网: https://ffmpeg.org/download.html, 选择Windows, 然后选择"Windows builds from gyan.dev" 在弹出的界面中找到release builds, 然后选择一个版本&#xff0…

Java中的生产者/消费者模型

一、什么是生产者/消费者模型 生产者-消费者模型&#xff08;Producer-Consumer problem&#xff09;是一个非常经典的多线程并发协作的模型。 比如某个模块负责生产数据&#xff0c;而另一个模块负责处理数据。产生数据的模块就形象地被称为生产者&#xff1b;而处理数据的模…

基地培训一周总结-用两台虚拟机模拟公司和员工

前言&#xff1a; 本来是打算每天跟更新所学内容&#xff0c;但奈何自己接触新知识速度较慢&#xff0c;每天都在完不成任务的边缘疯狂试探&#xff0c;短时间大量知识的涌入&#xff0c;感觉脑袋瓜在有点 跟不上。这周结束的时候&#xff0c;老师布置了个小项目&#xff0c;融…

Linux操作系统下安装python环境

参考&#xff1a;Linux操作系统下安装python环境_linux如何下载python_秃头小猿-F的博客-CSDN博客 注意 切换用户 二、切换root用户 1.给root用户设置密码&#xff1a;命令&#xff1a;sudo passwd root输入密码&#xff0c;并确认密码。2.重新输入命令&#xff1a;su root …

【数据结构】之十分好用的“链表”赶紧学起来!(第一部分单向链表)

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

某行动态cookie反爬虫分析

某行动态cookie反爬虫分析 1. 预览 反爬网址(base64): aHR0cDovL3d3dy5wYmMuZ292LmNu 反爬截图&#xff1a; 需要先加载运行js代码&#xff0c;可能是对环境进行检测&#xff0c;反调试之类的 无限debugger 处理办法 网上大部分人说的都是添加cookie来解决。 那个noscrip…

哈工大计算机网络课程网络安全基本原理之:身份认证

哈工大计算机网络课程网络安全基本原理之&#xff1a;身份认证 在日常生活中&#xff0c;在很多场景下我们都需要对当前身份做认证&#xff0c;比如使用密码、人脸识别、指纹识别等&#xff0c;这些都是身份认证的常用方式。本节介绍的身份认证&#xff0c;是在计算机网络安全…

flask处理表单数据

flask处理表单数据 处理表单数据在任何 web 应用开发中都是一个常见的需求。在 Flask 中&#xff0c;你可以使用 request 对象来获取通过 HTTP 请求发送的数据。对于 POST 请求&#xff0c;可以通过 request.form 访问表单数据。例如&#xff1a; from flask import Flask, r…

设置Fiddler来抓取Android接口数据

1.下载安装fiddler&#xff0c;安装包可自行百度。安装完成打开fiddler 2.将Fiddler设置远程访问PC 选择Fiddler->Tools->Fiddler Option 3.选择Connection&#xff0c;在Fiddler listen on port后输入8888&#xff0c;表示允许远程PC连接。 4.在电脑运行窗口中&#xf…

Leetcode145. 二叉树的后序遍历

题目描述 题目链接&#xff1a;https://leetcode.cn/problems/binary-tree-postorder-traversal/description/ 代码实现 class Solution {List<Integer> tree new ArrayList<>();public List<Integer> postorderTraversal(TreeNode root) {postorder(ro…

深度学习实践——卷积神经网络实践:裂缝识别

深度学习实践——卷积神经网络实践&#xff1a;裂缝识别 系列实验 深度学习实践——卷积神经网络实践&#xff1a;裂缝识别 深度学习实践——循环神经网络实践 深度学习实践——模型部署优化实践 深度学习实践——模型推理优化练习 深度学习实践——卷积神经网络实践&#xff…

Android SDK 上手指南||第一章 环境需求||第二章 IDE:Eclipse速览

第一章 环境需求 这是我们系列教程的第一篇&#xff0c;让我们来安装Android的开发环境并且把Android SDK运行起来&#xff01; 介绍 欢迎来到Android SDK入门指南系列文章&#xff0c;如果你想开始开发Android App&#xff0c;这个系列将从头开始教你所须的技能。我们假定你…

NOSQL之Redis配置及优化

目录 一、关系型数据库 二、非关系型数据库 三、关系型数据库和非关系型数据库区别 1、数据存储方式不同 2、扩展方式不同 3、对事务性的支持不同 四、Redis简介 五、Redis优点 &#xff08;1&#xff09;具有极高的数据读写速度 &#xff08;2&#xff09;支持丰富的…

软件架构师——1、计算机组成与体系结构

计算机结构 &#xff08;★&#xff09; 运算器&#xff1a; 算术逻辑单元ALU&#xff1a;数据的算术运算和逻辑运算累加寄存器AC&#xff1a;通用寄存器&#xff0c;为ALU提供一个工作区&#xff0c;用于暂存数据数据缓冲寄存器DR&#xff1a;写内存时&#xff0c;暂存指令或…

Nginx 如何根据swagger关键字屏蔽页面

目录 一、知识回顾1.什么是 location2.location 语法3.location 的匹配规则4.优先级排序 二、如何根据关键字筛选请求1.实现方案2.测试结果 一、知识回顾 1.什么是 location Nginx 中通过根据 location 块的规则来将匹配到的 URL 请求进行一系列操作&#xff0c;最常见的就是…

【C++】STL——stack的介绍和使用、stack的push和pop函数介绍和使用、stack的其他成员函数

文章目录 1.stack的介绍2.stack的使用2.1stack构造函数2.1stack成员函数&#xff08;1&#xff09;empty() 检测stack是否为空&#xff08;2&#xff09;size() 返回stack中元素的个数&#xff08;3&#xff09;top() 返回栈顶元素的引用&#xff08;4&#xff09;push() 将元素…

QT数据库编程

ui界面 mainwindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include <QButtonGroup> #include <QFileDialog> #include <QMessageBox> MainWindow::MainWindow(QWidget* parent): QMainWindow(parent), ui(new Ui::M…