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

    #浅拷贝(复制一份,就相当于抄一遍)

    list1 = ['赤,橙,黄,绿,青,蓝,紫']
    list2 = list1[:] #切片会产生一个新的列表
    list3 = list1.copy() #浅拷贝
    print(id(list1))
    print(id(list2))
    print(id(list3))

    结果内存地址都不一样:
    内存地址 3276933495680
    内存地址 3276963987136 
    内存地址 3276963986880
    浅拷贝如图示范:
    1 list1 数据为列表 [赤,橙,黄,绿,青,蓝,紫 ] 内存地址为1a1b list1指针指向内存地址1a1b list1的数据改变不会影响到list2
    2 list2 执行切片 或者 copy的时候,会产生一个新的列表 内存地址为2a2b list2指针指向2a2b

     注意浅拷贝的另外一种情况:  list1的数据改变为什么会影响到list2 ?  浅拷贝不是说只是复制一份吗? 在浅拷贝后;追加的list3.append('蓝') 为什么list2还是会有"蓝"? 看图解释

    list1 = ['赤','橙','黄',['青']]
    list2 = list1.copy()
    list1[3].append("蓝")
    print(list1) ['赤', '橙', '黄', ['青', '蓝']]
    print(list2) ['赤', '橙', '黄', ['青', '蓝']]

    从图中可以看出来,['青'] 在嵌套列表中还是一个内存地址,当list2浅拷贝list1的内容适合,实际是['赤','橙','黄',内存地址3a3b],
    当list1进行list1[3].append("蓝")的时候,实际是修改的这个3a3b内存地址内容,list2读3a3b内存地址发现是指向的['青','蓝'],所以内容也会改变.

     

     

    
    

     验证内存地址一样

    print(id(list1[3])) 
    print(id(list2[3]))
    
    

     

    深拷贝 

    1 #深拷贝需要使用copy模块

    import copy
    list1 = ['赤','橙','黄',['青']]
    list2 = copy.deepcopy(list1) #深拷贝,简单来说就是全部复制一份
    list1[3].append("蓝")
    print(id(list1[3])) 内存地址跟list2[3]不一样
    print(id(list2[3])) 内存地址跟list1[3]不一样

    print(list1[3])
    print(list2[3])

       如图示:深浅拷贝最大的区别在['青']这个对象,如果是浅拷贝list1 和 list2 列表中的 ['青']对象内存地址是同一个,如果是深拷贝, ['青']对象内存地址在深拷贝的时候,会重新拷贝一份新的产生一个新的内存地址,list1 和list2 2个数据从此再无关联 

      深拷贝,就类似于,我要制作一个孙悟空,我连孙悟空的师傅师弟全部做一份新的,  浅拷贝;我新制作一个孙悟空,但是师傅师弟还是用同一份

     

     总结:

      赋值操作,没有创建对象

      浅拷贝,只拷贝第一层  使用切片[:] or copy() 做浅拷贝操作

        深拷贝,把这个对象内容以及内部的所有内容全部拷贝一遍,使用copy模块

     

    
    
     
  • 相关阅读:
    MySQL 触发器
    MySQL视图
    MySQL中的存储过程和函数
    Mysql数据库连接查询
    数据库(MySQL)表基本操作
    Spring MVC---数据绑定和表单标签
    Spring MVC---基于注解的控制器
    Spring基于AOP的事务管理
    Ubuntu下通过wine安装HeidiSQL
    chmod命令详解
  • 原文地址:https://www.cnblogs.com/ajaxa/p/12096610.html
Copyright © 2011-2022 走看看