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

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

  • 相关阅读:
    Layui 两个table 人员选择 多选
    iphone7 忘记密码 重装系统
    使用hql-统计连续登陆的三天及以上的用户
    azkaban群起/群停脚本
    Hive读取索引文件问题:select * 和select count(*)读取出来的行数不一致
    scala/java等其他语言从CSV文件中读取数据,使用逗号','分割可能会出现的问题
    hadoop3.1.3版本的secondaryNamenode的web界面不能显示的问题?
    启动kafka消费报错:WARN [Consumer clientId…] 1 partitions have leader brokers without a matching listener,…
    centos6和centos7的防火墙命令,以及它们的区别是是什么?
    kafka项目经验之如何进行Kafka压力测试、如何计算Kafka分区数、如何确定Kaftka集群机器数量
  • 原文地址:https://www.cnblogs.com/yanghr/p/14161797.html
Copyright © 2011-2022 走看看