深浅copy

news2024/11/15 17:27:06

go

  1. 在go语言中值类型赋值都是深拷贝,引用类型一般都是浅拷贝
  2. 其本质就是,深拷贝会拷贝数据,而浅拷贝只会拷贝内存的地址,所有就会出现,像slice那样修改底层数组的值,slice的值也跟着改动。

深拷贝

修改a的值b不变,说明是值的拷贝

func main() {
    var a = 123
    b := a
    fmt.Println(a, b)
    a = 456
    fmt.Println(a, b)
}

浅拷贝

修改a的值,b的值也跟着修改了,原因是两个slice指向同一个内存地址,所以得出记录slice拷贝是浅拷贝

func main() {
    a := []int{1, 2, 3}
    b := a
    fmt.Println(a, b)
    a[0] = 1000
    fmt.Println(a, b)
}

slice深拷贝

可以通过内置的copy函数实现,或append导致扩容形成一个新的切片

func main() {
    a := []int{1, 2, 3}
    b := make([]int, 0)
    b = append(b, a[:]...)
    fmt.Println(a, b)
    a[1] = 1000
    fmt.Println(a, b)
    fmt.Printf("%p,%p", a, b)
}

func main() {
    slice1 := []int{1, 2, 3, 4, 5}
    slice2 := []int{5, 4, 3}

    copy(slice2, slice1) // 只会复制slice1的前3个元素到slice2中
    fmt.Println(slice1, slice2)
    copy(slice1, slice2) // 只会复制slice2的3个元素到slice1的前3个位置
    fmt.Println(slice1, slice2)
}

总结

  1. 赋值操作:

    1. 如果是值类型,就会产生深拷贝
    2. 如果是引用类型,就会产生浅拷贝
  2. 深浅拷贝的区别:

    1. 深拷贝:光拷贝值,地址不相关。拷贝结束两变量互不影响。
    2. 浅拷贝:拷贝地址。两变量指向同一地址。拷贝结束也相关,改变一个,另一个也跟着变。

python

有点小不同:

  1. 对于不可变类型:不论深浅拷贝,都是引用。
  2. 浅拷贝:只复制最外层的结构,除最外层其余的直接将其地址引用过来。
  3. 深拷贝:全部数据/结构都进行复制,(除不可变类型)增大数据独立性 ,如果深拷贝中,只要发现复制数据中有一个不是不可变类型就重新创建。
from copy import deepcopy, copy


def echo_addr(interface):
    return hex(id(interface))


def init():
    # 赋值
    l1 = [1, 2, 3]
    l2 = l1
    print(echo_addr(l1), echo_addr(l2))
    # 0x2ca7d68e600 0x2ca7d68e600
    print(echo_addr(l1[0]), echo_addr(l2[0]))
    # 0x7ff8b3451710 0x7ff8b3451710
    l2[0] = 5
    print(l1, l2)
    # [5, 2, 3] [5, 2, 3]


def cp():
    # 浅拷贝
    l1 = [1, 2, 3]
    l2 = copy(l1)
    print(echo_addr(l1), echo_addr(l2))
    # 0x2950198e700 0x2950198e540
    print(echo_addr(l1[0]), echo_addr(l2[0]))
    # 0x7ff8b3451710 0x7ff8b3451710
    l2[0] = 5
    print(l1, l2)
    # [1, 2, 3] [5, 2, 3]


def deep_cp():
    # 深拷贝
    l1 = [1, 2, 3]
    l2 = deepcopy(l1)
    print(echo_addr(l1), echo_addr(l2))
    # 0x2059c9ce740 0x2059c9ce580
    print(echo_addr(l1[0]), echo_addr(l2[0]))
    # 0x7ff8b3451710 0x7ff8b3451710
    l2[0] = 5
    print(l1, l2)
    # [1, 2, 3] [5, 2, 3]


# init()
# cp()
deep_cp()


def cpcpcpcpcp():
    a = 1
    b = copy(a)
    c = deepcopy(a)

    print(echo_addr(a), echo_addr(b), echo_addr(c))
    # 0x7ff88bce1710 0x7ff88bce1710 0x7ff88bce1710

# cpcpcpcpcp()

在这里插入图片描述

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

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

相关文章

[iHooya]1月15日寒假班作业解析

过滤多余的空格 一个句子中也许有多个连续空格,过滤掉多余的空格,只留下一个空格。 输入:一行,一个字符串(长度不超过200),句子的头和尾都没有空格。 输出:过滤之后的句子。 样例输…

全球各国机场名称、坐标经纬度、高程数据(更新至2022年)

数据来源:自主整理 时间跨度:更新至2022 区域范围:全球各国 指标说明: 全球机场坐标数据,包含CSV格式、shpfile格式、kml格式属性字段包括机场类型、经纬度,高程,所在国家省市区域&#xff…

5.12回溯法--连续邮资问题--子集树

回溯法的题目太多了,不想写这个代码了,于是我就开始水一篇文章,就单纯的分析一下这个问题保持整本书完整的队形 问题描述 如何用有限的邮票数,贴出更多面额的需求? 举例 n5,m4 设计1:X1{1, …

20多年老码农的IT学习之路

20年IT工作经历,目前在一家500强做企业架构,年薪税前150万多.最近公司业绩不好,有感觉工作不保,所以又捡起了编程,开始学习Golang,Angular等。我不是985,211也不是海归,我…

基于ssm+mysql+jsp实现在线花店

基于ssmmysqljsp实现在线花店一、系统介绍1、系统主要功能:2、环境配置二、功能展示1.主页(客户)2.登陆(客户)3.我的购物车(客户)4.我的订单(客户)5.主页(管理员)6.订单管理(管理员&…

什么是链路追踪?分布式系统如何实现链路追踪?

在分布式系统,尤其是微服务系统中,一次外部请求往往需要内部多个模块,多个中间件,多台机器的相互调用才能完成。在这一系列的调用中,可能有些是串行的,而有些是并行的。在这种情况下,我们如何才…

PANNs:用于音频模式识别的大规模预训练音频神经网络

摘要 音频模式识别是机器学习领域的一个重要研究课题,它包括音频标注、声音场景分类、音乐分类、语音情感分类和声音事件检测等任务。近年来,神经网络已被应用于解决音频模式识别问题。然而,以前的系统是建立在特定数据集上的,数…

商业化广告--体系学习-- 17 -- 业务实战篇 --平台建设:如何从0到1建立一个完整的广告产品平台?

这是一个非常完整的广告产品平台,它包括广告投放平台(代理型和自助型)、销售类平台、运营类平台、数据类平台以及流量合作类平台五个部分。我们之前提到过程序化交易的一系列平台,但那些对于一个头部的媒体平台来说并不完整。一个…

结构分析软件:2D Frame Analysis 7.2.6 Crack

结构分析软件:2D Frame Analysis 7.2.6 用于在静态、动态、线性和非线性载荷下对框架、梁和桁架进行结构分析的软件工具。它包括静态版和桁架版的所有功能 2D 框架分析软件套件以及处理动态负载的能力。自动计算结构的动态模态,并以图形方式表示相应的模…

Java图形化界面---

目录 一、JColorChooser (1)JColorChooser的介绍 (2)JColorChooser案列 二、JFileChooser (1)JFileChooser的介绍 (2)JFileChooser使用步骤 (3)JFileChooser案例 …

【云原生进阶之容器】第四章Operator原理4.4节--Operator深入实践

1 Operator 深入实践 在本节中,我们将重点关注 etcd-cluster-operator,用于管理 Kubernetes 内部的 etcd。简单地说,etcd 是一个分布式键值数据存储系统,它有能力管理自己的稳定性,只要: 每个 etcd 实例都有一个用于计算、网络和存储的独立故障域。每个 etcd 实例都有一个…

读 | Software Architecture Patterns

个人博客 Software Architecture Patterns》是 Mark Richards 2015 年出的一本小册子,对常用的架构模式进行了一个简单梳理,书中列了 5 种: 分层(Layered)事件驱动(Event-Driven)微内核&#…

HTML的常见标签

什么是 HTML? HTML 是英文 Hyper Text Markup Language(超文本标记语言)的缩写,是一种用于创建网页的标准标记语言。 什么是HTML 标签? HTML 文档和 HTML 元素是通过 HTML 标签进行标记的 HTML 标签是由尖括号包围的关键词&am…

【阶段四】Python深度学习07篇:深度学习项目实战:循环神经网络的原理和结构

本篇的思维导图: 循环神经网络 循环神经网络,就是专门用于处理语言、文字、时序这类特征之间存在“次序”的问题。这是一种循环的、带“记忆”功能的神经网络,这种网络针对序列性问题有其优势。 循环神经网络的原理和结构 序列数据的概念 序列数据,是其特征的先后…

电路方案分析(十六)高效备用电源设计方案

高效备用电源设计方案 备用电源: 备用电源是一种在主电源发生故障时为负载提供紧急电源的电气系统。适当的备用电源通过提供存储在备用电容器或电池中的能量,提供即时保护,防止主电源中断而产生故障。这种备份电源通常用于保护硬件&#xf…

表单<form>

创建表单 <form> 标签用于创建供用户输入的 HTML 表单。 <form>标签的action属性的值指定了表单提交到服务器的地址。 <form> 元素包含一个或多个如下的表单元素&#xff1a; <input> <textarea> <button> <select> <option&g…

JAVA设计模式--行为型模式--职责链模式

1.责任链模式&#xff08;Chain of Responsibility Pattern&#xff09; 1.1介绍 为请求创建了一个接收者对象的链。这种模式给予请求的类型&#xff0c;对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。在这种模式中&#xff0c;通常每个接收者都包含对…

C语言文件操作(一文带你吃透文件各种操作)

文章目录 一、为什么要使用文件 二、什么是文件 2、1 程序文件 2、2 数据文件 2、3 文件名 三、文件的打开关闭及读写操作 3、1 文件指针 3、2 文件的打开和关闭操作 3、3 文件的读写函数详解 3、3、1 fgetc、fputc函数详解 3、3、2 fgets、fputs函数详解 3、3、3 fscanf、fpri…

神经网络介绍-激活函数、参数初始化、模型的搭建

目录1、深度学习了解1.1 深度学习简介1.2 神经网络2、神经网络的工作流程2.1 激活函数2.1.1 Sigmoid/Logistics函数2.1.2 tanh&#xff08;双曲正切曲线&#xff09;2.1.3 RELU2.1.4 Leaky Relu2.1.5 SoftMax2.1.6 其他激活函数2.2 参数初始化2.2.1 随机初始化2.2.2 标准初始化…

【博客585】ipvs场景下dummy网卡的作用

linux ipvs模式下dummy网卡的作用 1、场景&#xff1a; 在使用ipvs来实现vip的负载均衡的时候&#xff0c;有时我们会在linux中创建一块dummy网卡&#xff0c;并在网卡上绑上vip 2、场景示例&#xff1a;k8s kube-proxy组件的ipvs模式 kube-proxy在ipvs模式下生成了一块kub…