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

    前言:在python 中 int 、str 、tuple(元组)是不可变对象 ;list、dict属于可变对象

    from copy import copy,deepcopy   #先引入用到的方法
    list1=[1,2,("abc",1,2),[6,7,8]]
    list2=copy(list1)    #浅拷贝
    list3=list1[:]   #这个地方是为了说明切片相当于一个浅拷贝
    print("三个列表的id内存地址如下:")
    print(id(list1))
    print(id(list2))
    print(id(list3))  #根据结果可看出三个列表的id内存地址都是不一样的
    print("=============================================")
    print("三个列表的可变子列表的id地址如下:")   #分别比较各列表的第四个元素,为list类型的元素(可变对象)
    print(id(list1[3]))
    print(id(list2[3]))
    print(id(list3[3]))   #从下图输出结果可以看到,浅拷贝的可变子列表的id都是一样的
    print("三个列表的不可变子列表的id地址如下:")   #分别比较各列表的第三个元素,其为tuple类型元素(不可变对象)
    print(id(list1[2]))
    print(id(list2[2]))
    print(id(list3[2]))   #从下图输出结果可以看到,浅拷贝的可变子列表的id都是一样的
    
    #下面定义一个深拷贝:
    list6=deepcopy(list1)
    print("==================================================")
    print("原列表的id地址:{}".format(id(list1)))
    print("深拷贝列表的id地址:{}".format(id(list6)))
    
    print("==================================================")
    print("原列表的不可变元素id地址:{}".format(id(list1[2])))
    print("深拷贝列表的不可变元素id地址:{}".format(id(list6[2])))         #这里比较的还是列表的第三个元素,tuple类型(不可变对象)
    
    print("==================================================")
    print("原列表的可变元素id地址:{}".format(id(list1[3])))
    print("深拷贝列表的可变元素id地址:{}".format(id(list6[3])))              #这里比较第四个元素

    上面的代码运行的结果如下:

    2335298709248
    2335299365760
    2335299364992
    =============================================
    三个列表的可变子列表的id地址如下:
    2335298711424
    2335298711424
    2335298711424
    三个列表的不可变子列表的id地址如下:
    2335298637696
    2335298637696
    2335298637696
    ==================================================
    原列表的id地址:2335298709248
    深拷贝列表的id地址:2335299365504
    ==================================================
    原列表的不可变元素id地址:2335298637696
    深拷贝列表的不可变元素id地址:2335298637696
    ==================================================
    原列表的可变元素id地址:2335298711424
    深拷贝列表的可变元素id地址:2335299365824

    总结:我们可以简单的理解为:其实浅拷贝只是拷贝了最外一层,其可变子列表指向的还是同一个内存地址。但是深拷贝,会把所有的层都拷贝(只针对可变对象,即不可变对象的内存地址还是一样的),这里的层可以简单的理解为一个[] 、()、{} 就算一层

  • 相关阅读:
    【安装软件的点点滴滴】
    【自然语言处理】LDA
    【sklearn】数据预处理 sklearn.preprocessing
    【sklearn】中文文档
    【MySql】update用法
    DotNet Core
    ASP.NET MVC
    ADO.NET
    RESTful API
    C#
  • 原文地址:https://www.cnblogs.com/yanghr/p/14161797.html
Copyright © 2011-2022 走看看