zoukankan      html  css  js  c++  java
  • python深copy与浅copy的区别

    首先先看一段代码

    import copy
    
    a = [1, 2, 3, [4]]
    b = a
    c = a.copy()
    d = copy.deepcopy(a)
    e = copy.copy(a)
    a.append(4)
    a[3].append(5)
    print('a值为 {} 地址为 {}'.format(a, id(a)))
    print('b值为 {} 地址为 {}'.format(b, id(b)))
    print('c值为 {}    地址为 {}'.format(c, id(c)))
    print('d值为 {}       地址为 {}'.format(d, id(d)))
    print('e值为 {}    地址为 {}'.format(e, id(e)))
    

      

    执行结果:

    a值为 [1, 2, 3, [4, 5], 4] 地址为 4555940360
    b值为 [1, 2, 3, [4, 5], 4] 地址为 4555940360
    c值为 [1, 2, 3, [4, 5]]    地址为 4555873544
    d值为 [1, 2, 3, [4]]       地址为 4556227912
    e值为 [1, 2, 3, [4, 5]]    地址为 4556227464

    从结果中可以看出来:

    b赋值的为a的内存地址,值会随着a的变化而变化---直接赋值,对象引用

    c=a.copy()使用的为python自带的copy方法,从结果中可看出复制后c中的父级内容不随着a的变化而变化,但c里面的子list随着a的变化而变化,---浅copy,拷贝父对象,不会拷贝对象的内部的子对象

    d和e使用的是python自带的copy模块中的copy方法和deepcopy方法:

      其中d的值地址和a不一致,值也不会随着a的变化而变化---深copy,完全拷贝了父对象及其子对象

          其中e中父级内容不随着a的变化而变化,但e中子list中内容会随着a的变化而变化---浅copy,拷贝父对象,不会拷贝对象的内部的子对象

    print('a子对象值为 {} 地址为 {}'.format(a[3], id(a[3])))
    print('e子对象值为 {} 地址为 {}'.format(a[3], id(a[3])))
    
    
    结果:
    a子对象值为 [4, 5] 地址为 4334486344
    e子对象值为 [4, 5] 地址为 4334486344
    

      

    由上可得出,python中的copy分为三种:

    1、直接复制:也就是对象引用

    2、浅拷贝:拷贝父对象,不会拷贝对象的内部的子对象。

    3、深拷贝:完全拷贝了父对象及其子对象

  • 相关阅读:
    【五一qbxt】day7-1 引水入城
    【五一qbxt】day6 OI中的stl
    【五一qbxt】test2
    ASCII码
    深入浅出Redis04使用Redis数据库(lists类型)
    深入浅出Redis03 使用Redis数据库(hashes类型)
    深入浅出Redis01安装
    FireFox & Chrome 使用技巧
    Android学习笔记03-搭建Win8下的Android开发环境
    java + jquery + ajax + json 交互
  • 原文地址:https://www.cnblogs.com/huwang-sun/p/12092809.html
Copyright © 2011-2022 走看看