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

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

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

  • 相关阅读:
    Apache Ant 1.9.1 版发布
    Apache Subversion 1.8.0rc2 发布
    GNU Gatekeeper 3.3 发布,网关守护管理
    Jekyll 1.0 发布,Ruby 的静态网站生成器
    R语言 3.0.1 源码已经提交到 Github
    SymmetricDS 3.4.0 发布,数据同步和复制
    beego 0.6.0 版本发布,Go 应用框架
    Doxygen 1.8.4 发布,文档生成工具
    SunshineCRM 20130518发布,附带更新说明
    Semplice Linux 4 发布,轻量级发行版
  • 原文地址:https://www.cnblogs.com/come202011/p/13353947.html
Copyright © 2011-2022 走看看