zoukankan      html  css  js  c++  java
  • python---深浅拷贝

        这篇文章主要介绍了python中的拷贝问题,即不同的拷贝方式得到的新对象,对其进行修改是否影响原对象。了解这一块,首先需要了解数据类型,所以接下来从数据类型讲起。

        依据对象在内存中的组织分类,可以分为以下两种类型:

        一. 原子类型:只能保存单个字面对象的类型, 如数值(所有的数值类型),字符串(全部是文字)。

        二. 容器类型:可容纳多个对象的类型,如 列表,元祖,字典等

       对于原子类型,不存在深浅拷贝的说法,每一个不同的值代表一个新的对象。

     1 >>> import copy
     2 >>> d=23
     3 >>> e0=d
     4 >>> e1=copy.copy(d)
     5 >>> e2=copy.deepcopy(d)
     6 >>> e0=230
     7 >>> e1=231
     8 >>> e2=232
     9 >>> d, e0, e1, e2
    10 (23, 230, 231, 232)

    对于容器类型,有以下两种拷贝方式: ini=[12,  'beautiful',  ['we', 'are', 'a', 'team'] ]

    1)常见赋值

    等号赋值,等号两边指向的是同一个对象,等号左边是对象的别名,不管对别名还是自身操作修改的都是同一内存中的对象。即ini_0 是 ini.

     1 >>> ini=[12, 'beautiful', ['we', 'are', 'a', 'team']]
     2 >>> ini_0=ini
     3 >>> ini_0[0]=120
     4 >>> ini_0[1]='cute'
     5 >>> ini_0[2].append('world')
     6 >>> ini_0
     7 [120, 'cute', ['we', 'are', 'a', 'team', 'world']]
     8 >>> ini
     9 [120, 'cute', ['we', 'are', 'a', 'team', 'world']]
    10 >>>

    2)浅拷贝

    浅拷贝产生一个新的对象,但对象中的子对象指向的是原对象,代码效果如下:

     1 >>> ini
     2 [120, 'cute', ['we', 'are', 'a', 'team', 'world']]
     3 >>> ini_1=copy.copy(ini)
     4 >>> ini_1[0]=121
     5 >>> ini_1[1]='clever'
     6 >>> ini_1[2].remove('team')
     7 >>> ini_1
     8 [121, 'clever', ['we', 'are', 'a', 'world']]
     9 >>> ini
    10 [120, 'cute', ['we', 'are', 'a', 'world']]
    11 >>>

    也就是说,ini_1 不是ini, 但ini_1[i] 是 ini[i]。

    3)深拷贝

    深拷贝也产生一个新的对象,并且对象中的子对象不指向原对象的子对象,代码效果如下:

     1 >>> ini
     2 [120, 'cute', ['we', 'are', 'a', 'world']]
     3 >>> ini_2=copy.deepcopy(ini)
     4 >>> ini_2[0]=122
     5 >>> ini_2[1]='happy'
     6 >>> ini_2[2].append('family')
     7 >>> ini
     8 [120, 'cute', ['we', 'are', 'a', 'world']]
     9 >>> ini_2
    10 [122, 'happy', ['we', 'are', 'a', 'world', 'family']]
    11 >>>

    也就是说,ini_2 不是ini, 但ini_2[i] 也不是 ini[i]。

  • 相关阅读:
    Spring MVC全局异常后返回JSON异常数据
    spring mvc 异常统一处理方式
    Duplicate fragment name ERROR Jetty Maven Plugin
    Android中自己定义组件和它的属性
    stl非变易算法(二)
    unix more命令
    g711u与g729比較编码格式
    MD5的加密和解密(总结)
    js 定义类对象
    润乾报表实现可反复分组报表及改进
  • 原文地址:https://www.cnblogs.com/no-tears-girl/p/7592990.html
Copyright © 2011-2022 走看看