python中深拷贝和浅拷贝的区别

news2025/7/9 3:40:51

文章目录

  • 值的引用
  • 浅拷贝
  • 可变数据类型与不可变数据类型
    • 不可变数据类型
    • 可变数据类型
  • 深拷贝
  • 深拷贝浅拷贝总结

若将需要注释若干行,则将这些行选中,然后按住 ctrl + / 键就可以了,再按一次,即可取消多行注释
若要批量缩进,那么将需要缩进的行都选中,按 tab 键就可以
若要取消批量缩进,则选中对应行,按 shift + tab

值的引用

# 1、值的引用
num1 = [1, 2, 3]
num2 = num1  # num1和num2指向同一个内存空间
num1.append(4)
print(num2)  # [1,2,3,4]

浅拷贝

# 2、浅拷贝
n1 = [1, 2, 3]
n2 = n1.copy()  # n1.copy和n1[:]切片均能实现拷贝
print(id(n1), id(n2))  # n1和n2的内存地址不同
n1.append(4)  # n1和n2内存地址不相同,互不影响,修改n1不会影响n2
print(n2)  # [1,2,3]

在这里插入图片描述

可变数据类型与不可变数据类型

  • 可变数据类型(可以增删改):列表
  • 不可变数据类型:字符串、元组、所有的数值型、命名元组

不可变数据类型

整型是不可变数据类型,不可变数据类型是变量指向内存空间的值不会发生改变

a=5
print(id(a))
a=10
print(id(a)) #两者内存地址不一样

在这里插入图片描述

从内存空间的角度可以理解为:
内存空间中有2块位置分别存放了值5和值10,
第一次定义变量a时,a指向值5的内存地址,第二次定义变量a时,由于整型是不可变数据类型,值无法改变,因此a重新指向值10的内存地址

可变数据类型

列表是可变数据类型
可变数据类型:变量指向的内存空间中以存放的值是可发生更改的

li=[1,2,3]
print(id(li))
li.append(4)
print(li)
print(id(li)) #内存地址是一致的

在这里插入图片描述
上述例子可以理解为:
在一块内存空间中存放了列表[1,2,3],变量li指向该内存空间,
当需要添加删除元素时,是直接对该内存空间中的值更改,这就叫做可变数据类型

深拷贝

如果列表的元素包含可变数据类型,一定要用深拷贝

n1=[1,2,[1,2]]
n2=n1.copy() #浅拷贝
print(id(n1),id(n2)) #n1和n2的内存地址不相同
print(id(n1[-1]),id(n2[-1])) #n1[-1]n2[-1]内存地址相同
n1[-1].append(4)
print(n2) #[1, 2, [1, 2, 4]]
#如果列表嵌套的时候,或者列表中包含可变数据类型,拷贝时一定选择深拷贝

在这里插入图片描述
修改了n1,但是n2也发生了变化。通过使用深拷贝,能够使得n1和n2完全独立
那么深拷贝该如何实现呢?

import  copy
n1=[1,2,[1,2]]
n2=copy.deepcopy(n1)
print(id(n1),id(n2)) #n1和n2的内存地址不相同
print(id(n1[-1]),id(n2[-1])) #n1[-1]和n2[-1]内存地址不相同
n1[-1].append(4) #[1, 2, [1, 2, 4]]
print(n2) #[1, 2, [1, 2]]
#如果列表嵌套的时候,或者列表中包含可变数据类型,拷贝时一定选择深拷贝

在这里插入图片描述通过深拷贝,实现了n1和n2完全独立。

深拷贝浅拷贝总结

赋值: 创建了对象的一个新的引用,修改其中任意一个变量都会影响到另一个(因为都指向同一块内存地址)
浅拷贝:另外一个变量的内存地址的拷贝,这两个变量指向同一个内存地址的变量值(li.copy copy.copy)

  • 公用一个值
  • 这两个变量的内存地址一样
  • 对其中一个变量的值改变,另外一个变量的值也会改变

深拷贝: 一个变量对另外一个变量的值拷贝(copy.deepcopy())

  • 两个变量的内存地址不同
  • 两个变量各有自己的值,且互不影响
  • 对其中任意一个变量的值的改变不会影响另外一个

更形象点说:
深拷贝和浅拷贝最根本的区别在于是否真正获得一个对象的复制实体,而不是引用
假设B复制了A,修改A的时候,看B是否发生变化
如果B也发生了变化,说明是浅拷贝,拿人手短。(修改堆内存中的同一个值)
如果B没有发生变化,说明是深拷贝,自食其力。(修改堆内存中的不同的值)

在这里插入图片描述

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

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

相关文章

磷脂酰丝氨酸 猪脑(phosphatidylserine,PS)试剂级;丝氨酸磷脂

磷脂酰丝氨酸(phosphatidylserine,PS)又称丝氨酸磷脂,二酰甘油酰磷酸丝氨酸,简称PS,是一类普遍存在的磷脂,通常位于细胞膜的内层,磷酯化合物中的磷酸甘油酯类,是细胞膜组…

QGIS创建要素与属性

QGIS之矢量操作——创建要素与属性 创建要素 打开常用的工具条:View—Toolbar 这样常用的工具条就加载进来了 新建矢量图层,并设置字段等等: 创建属性,选中你的矢量图层,右键选择Toggle_Editing(或者点击…

SpringBoot项目上线运维

文章目录一.高级属性配置1.1 简介1.2 临时属性设置1.3 配置文件的四级分类1.4 自定义配置文件二.多环境开发2.2 多环境开发(yaml版)2.3 多环境开发多文件版(yaml版)2.4 多环境开发(Properties版)2.5 多环境…

这次把怎么做好一个PPT讲清-画图篇

文章目录概述布尔运算PPT幻灯片中如何设置形状对象格式每一个图形既是一个形状,又是一个文本框如何用PPT来实现三维3D效果,附参数设置详解怎么用ppt画三维立体图?**PPT做3D可动样机****PPT做3D[动态图标]****PPT做3D插画**如何使用[PPT绘图]&#xff1f…

图像处理:图像清晰度评价

目录 0、实现效果 1、概述 2、模糊度分类 1、运动模糊 2、压缩模糊 3、高斯模糊 3、清晰度量化指标 Brenner 能量梯度函数(Energy of Gradient) ​编辑 Roberts Laplace SMD(灰度方差)函数 SMD2 (灰度方差乘积)函数 …

JUC学习笔记——并发工具线程池

在本系列内容中我们会对JUC做一个系统的学习,本片将会介绍JUC的并发工具线程池 我们会分为以下几部分进行介绍: 线程池介绍自定义线程池模式之Worker ThreadJDK线程池Tomcat线程池Fork/Join 线程池介绍 我们在这一小节简单介绍一下线程池 线程池简介…

Linux基础教程:9、linux进程管理(2)

前面我们讲到fork创建子进程,那么这一期我们接着讲创建进程之后如何调试以及插入其他进程、特殊进程、和进程如何退出; 同样我们写了一个C语言程序,但是在这个程序中是有两个进程,我们调试的时候只会选择一个进程调试&#xff0c…

了解ixgbe网卡驱动— 驱动注册(纯代码分享)

1 ixgbe 网卡注册驱动 和大部分设备驱动一样,网卡驱动是作为一个 module 注册到 kernel 的 通过 module_init() -> ixgbe_init_module() -> pci_register_driver() 注册 ixgbe_driver 通过 module_exit() -> ixgbe_exit_module() -> pci_unregister_dr…

【仿牛客网笔记】项目进阶,构建安全高效的企业服务——置顶、加精、删除

添加依赖,去掉版本 实现置顶、加精的修改,删除 首先开发数据访问层,因为是对帖子的操作所以无论是置顶、加精最终是要修改帖子,先打开DiscussPostMapper增加修改的操作,一个修改类型,一个修改状态。 打…

[iOS]MonkeyDev安装

MonkeyDev官方安装文档:https://github.com/AloneMonkey/MonkeyDev/wiki/%E5%AE%89%E8%A3%85 1.安装HomeBrew 终端输入指令 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 选择源后安装 更多安装方式可以参…

HTML+CSS+JS大作业:网站设计——家具装修公司(12页 bootstrap, 响应式)

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 公司官网网站 | 企业官网 | 酒店官网 | 等网站的设计与制 | HTML期末大学生网页设计作业,Web大学生网页 HTML:结构 CSS&#…

如何使用VMware12PRO安装Mac OS

VMware安装参考我的这篇文章http://t.csdn.cn/kZ3oh (有VMware安装包) 准备的工具 unlocker链接: https://pan.baidu.com/s/1a1akxL_-JjNu70HJqJORZw?pwd9sjk 提取码: 9sjk Mac OS10.11CDR镜像链接: https://pan.baidu.com/s/1LIz0qFIL0Jg2M83oGqiDW…

RepVGG:让VGG风格的ConvNet再次伟大起来

引言 经典的卷积神经网络(ConvNet)VGG [31]在图像识别中取得了巨大的成功,其简单的架构由conv、ReLU和池化的堆栈组成。随着Inception [33,34,32,19]、ResNet [12]和DenseNet [17]的出现,许多研…

【Struts2】一_idea快速搭建struts2框架

文章目录什么是SSH框架?Struts2框架1、struts2的环境搭建1.1 创建web项目(maven),导入struts2核心jar包1.2 配置web.xml(过滤器),是struts2的入口,先进入1.3 创建核心配置文件struts…

C语言日记 36 类的组合

书P137: 如果声明组合类的对象时没有指定对象的初始值,自动调用无形参的构造函数, 构造内嵌对象时也对应调用内嵌对象的无形参的构造函数。 Q1:这里,对于“构造内嵌对象时也对应调用内嵌对象的无形参的构造函数”;他指的是什么…

STM32F429基于TouchGFX进行简单控制LED和显示ADC值

所需软件: CubeMX KEIL MDK ARM TouchGFX 首先配置外部时钟 配置时钟树,设置180MHZ 使能GPIO口如下,其中PA0用于LED 配置ADC通道 定时器TIM8触发 配置FMC和SDRAM,参数固定 使能DMA2D,参数如下: 配置LTDC 屏幕分…

JAVA反射

今天我们来讲一讲什么是java的反射机制,我们要了解一个新事物之前,我们应该首先的了解它的基本概念,那什么是反射呢? java的反射概念:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象&#…

centos7 安装hadoop

文章目录一、将hadoop的压缩文件传递到虚拟机里面二、解压缩三、配置环境变量一、将hadoop的压缩文件传递到虚拟机里面 路径随意,只要你能到时候能找到压缩文件就行。 二、解压缩 这里我给解压到opt/module目录里(没有可以自己创建,主要是为了方便管理) tar -zx…

Java#15(集合)

一.集合和数组的区别 1.从长度方面: 数组的长度是固定的,而集合的长度不是固定的 2.从存储类型方面: 数组可以存储基本数据类型也可以存储引用数据类型,而集合能存储引用数据类型,若是想要存储基本数据类型要将其变成对应的包装类 创建一个集合 二.ArrayList成员方法 1.boole…

【Spring5】使用JdbcTemplate操作mysql数据库

文章目录1 JdbcTemplate简介及操作准备2 添加操作3 修改与删除操作4 数据库查询操作4.1 返回一个值4.2 返回对象4.3 返回集合5 批量操作5.1 批量添加与修改5.2 批量修改与批量删除写在最后1 JdbcTemplate简介及操作准备 Spring框架对JDBC进行封装,使用JdbcTemplate…