zoukankan      html  css  js  c++  java
  • 深拷贝、浅拷贝、引用(总结)

    变量的传递:

    a = 2
    a = b 是把b指向的数据给a
    a和b的地址相同,最终a和b都指向2

    浅拷贝:

    c = 3
    d=4
    e=[c, d]
    f=copy.copy(e)
    e和f的内存地址不同,因为e. f是列表 列表是一个容器,容器也是有地址的
    e和f的元素地址是相同的,e和f指向同一元素

    深拷贝:
    c=3
    d=4
    e=[c, d]
    g=copy.deepcopy(e)
    e和g的元素地址不同,深拷贝是复制了e的元素值,在新的内存中粘贴了数据,
    所以虽然e和g的元素值相同,但是他们是不同的内存中的数据
    即g和e的容器地址不同,容器中指向的元素地址也是不同的


    深拷贝是递归拷贝,会拷贝最终指向的数据,而不是数据地址
    深拷贝的使用场景:涉及到修改数据的时候,为了不影响原有数据,就可以使用深拷贝
    对深拷贝后的数据进行修改,即不会对原有数据造成任何影响

    特殊:对元组进行深拷贝、浅拷贝


    1.元组中的元素都是不可变数据类型时【数字、字符串、元组】,无论对这个元组进行深拷贝或浅拷贝,最终都不会新建内存,不会新增数据,只是增加一个原数据的引用,原始元组、浅拷贝、深拷贝都是同一个地址

    2.当元组中的元素存在可变数据类型时【列表】,
    浅拷贝仍然是增加一个数据的引用,【注意,不像列表的浅拷贝那样新增了一个容器地址,元组浅拷贝后和原来的元组是同一个地址】
    而深拷贝会创建一个新的元组容器,这个新元组中的元素,对于不可变数据【数字、字符串、元组),还是和原始元组中的元素同一个地址
    但是可变数据元素【列表】和原始元组中的列表地址不同
    但是这两个列表中的元素地址还是相同的

    所以只要是不可变数据类型,无论深拷贝浅拷贝,增加的始终是对数据的引用,可以理解为数据的标签【变量名】增加了,不同的标签都指向同一个数据

    如果是可变数据类型【列表】。深拷贝会增加新的内存【新的容器地址】,但是容器中的元素【如果是不可变数据类型的话】还是指向相同的数据

  • 相关阅读:
    Zookeeper 系列(一)基本概念
    深入浅出 JMS(三)
    深入浅出 JMS(四)
    深入浅出 JMS(三)
    深入浅出 JMS(二)
    深入浅出 JMS(一)
    git 记住用户名和密码
    13 Maven 编写插件
    12 Maven 生成项目站点
    11 Maven 灵活的构建
  • 原文地址:https://www.cnblogs.com/come202011/p/13353947.html
Copyright © 2011-2022 走看看