zoukankan      html  css  js  c++  java
  • python中浅拷贝和深拷贝分析

    首先,我们知道Python3中,有6个标准的数据类型,他们又分为可以变和不可变。
    不可变:Number(数字)、String(字符串)、Tuple(元组)。
    可以变:List(列表)、Dictionary(字典)、Set(集合)。

    一.浅拷贝

    a 和 b 是一个独立的对象,但他们的子对象还是指向统一对象(是引用)
    浅拷贝后,改变原始对象中为可变类型的元素的值,会同时影响拷贝对象;改变原始对象中为不可变类型的元素的值,不会响拷贝对象。

    #定义一个列表,第一个元素是可变类型
    >>> A = [[1,2],'fei',90]
    #浅拷贝
    >>> B = copy.copy(A)
    #对象地址是否相同
    >>> A is B False
    #第一个元素地址是否相同
    >>> A[0] is B[0] True
    #第二个元素地址是否相同
    >>> A[1] is B[1] True
    #改变第一个可变类型的值,查看复制对象变化
    >>> A[0][0] = 2 >>> A [[2, 2], 'fei', 90]
    #复制对象也跟着改变了
    >>> B [[2, 2], 'fei', 90]
    #改变第二个不可变类型的值,查看复制对象变化
    >>> A[1] = 'anne' >>> A [[2, 2], 'anne', 90]
    #复制对象没有改变
    >>> B [[2, 2], 'fei', 90]

     

    二.深拷贝

    a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的。
    深拷贝,除了顶层拷贝,还对子元素也进行了拷贝。
    经过深拷贝后,原始对象和拷贝对象所有的可变元素地址都没有相同的了。

    #深拷贝
    >>> C = copy.deepcopy(A)
    #对象地址是否相同
    >>> A is C False
    #第一个元素地址是否相同
    >>> A[0] is C[0] False
    #第二个元素地址是否相同
    >>> A[1] is C[1] True
    #改变第一个元素,查看复制元素变化
    >>> A[0][0] = 2 >>> A [[2, 2], 'fei', 90]
    #复制元素不变,对复制元素没影响
    >>> C [[1, 2], 'fei', 90]
    #改变第二个元素,查看复制元素变化
    >>> A[1] = 'Anne' >>> A
    [[2, 2], 'Anne', 90]
    #复制元素不变,对复制元素没影响
    >>> C
    [[1, 2], 'fei', 90]

     在这里看到一个让我困惑的问题,A is B

    三.赋值引用

    a 和 b 都指向同一个对象

    #赋值引用
    >>> A = [[1,2],'fei',90]
    >>> D = A
    #对象地址是否相同
    >>> A is D
    True
    #第一个元素地址是否相同
    >>> A[0] is D[0]
    True
    #第二个元素地址是否相同
    >>> A[1] is D[1]
    True
    #改变A中第一个元素,查看是否影响D
    >>> A[0][0] = 2
    >>> A
    [[2, 2], 'fei', 90]
    #D中第一个元素也跟着改变
    >>> D
    [[2, 2], 'fei', 90]
    #改变D中第二个元素,查看是否影响A
    >>> D[1] = 'anne'
    #A中第二个元素也改变了
    >>> A
    [[2, 2], 'anne', 90]
    >>> D
    [[2, 2], 'anne', 90]
    >>> 

     

     

  • 相关阅读:
    scrapy 多个爬虫运行
    scrapy不抓取重复的网页解决办法
    centos7 安装mysql
    20个免费和开源数据可视化工具
    转载 CSDN 谈谈我对证券公司一些部门的理解(前、中、后台)
    scrapy 教程
    django 常见错误汇总
    python 常见错误
    python 基础知识整理
    使用SQL语法来查询Elasticsearch:Elasticsearch-SQL插件
  • 原文地址:https://www.cnblogs.com/jiangfan95/p/11466398.html
Copyright © 2011-2022 走看看