zoukankan      html  css  js  c++  java
  • 深浅Copy的理解

    在python里对对象进行拷贝有三个,即赋值,深拷贝,浅拷贝。

    而对象又分为两种,一种是不可变对象(字符串、元组、数字 ),一种是可变对象(列表、字典)。

    而深浅拷贝有三种情况:拷贝的是不可变对象、拷贝的是可变对象、拷贝的可变对象里面还有子对象

    拷贝不可变对象

    import copy
    list0 = 'hello,world'
    list1 = copy.copy(list0)
    list2 = copy.deepcopy(list0)
    list3 = list0
    
    print(list0, id(list0))
    print(list1, id(list1))
    print(list2, id(list2))
    print(list3, id(list3))

    对list0()进行修改:list0 = list0 + 'good evening'

    发现即使修改了list0,其他的值也不会变,地址也没有改变。

    结论:对于不可变对象来说,深浅拷贝都一样的,即便是用深拷贝,也都是一样的id,如果要重新赋值,也只是创建一个新的对象,替换旧的对象。所以对于不可变对象来说,不管怎么拷贝,它的地址、值都是一样的。 

    拷贝可变对象

    import copy
    list0 = [1,2,3,4,5,6]
    list1 = copy.copy(list0)
    list2 = copy.deepcopy(list0)
    list3 = list0
    
    print(list0, id(list0))
    print(list1, id(list1))
    print(list2, id(list2))
    print(list3, id(list3))

    对于可变对象来说:

      赋值(我们暂且称它为’=浅拷贝’)的新对象与原对象相比,值相等,地址也相等;
      浅拷贝:与原对象相比,值相等,地址不相等;
      深拷贝:与原对象相比,值相等,地址不相等。

    拷贝可变对象中还存在子对象的

    import copy
    list0 = [1,2,3,4,5,6, ['a', 'b']]
    list1 = copy.copy(list0)
    list2 = copy.deepcopy(list0)
    list3 = list0
    list0[6].append('c')
    print(list0, id(list0))
    print(list1, id(list1))
    print(list2, id(list2))
    print(list3, id(list3))

    结论:浅拷贝没有拷贝子对象,所以原对象发生改变,其子对象也发生了改变,而深拷贝拷贝了子对象,原对象发生改变,其本身也不会改变。

  • 相关阅读:
    servlet的九大内置对象
    java中static、transient修饰的属性不能被序列化
    java 字节流与字符流的区别
    mac 下如何切换jdk的版本
    00 python基础--目录结构
    html 5 本地数据库-- Web Sql Database核心方法openDatabase、transaction、executeSql 详解
    shell脚本入门
    Canvas API详解
    精通CSS滤镜(filter)(实例解析)
    CSS中加号、星号及其他符号的作用
  • 原文地址:https://www.cnblogs.com/1oo88/p/11417390.html
Copyright © 2011-2022 走看看