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

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    # @Author: fhb
    # @Date  : 2018/10/25
    # @Desc  :
    
    
    ## 赋值
    
    # 对于list, set, dict来说, 直接赋值. 其实是把内存地址交给变量量. 并不是复制一份内容. 所以. lst1的内存指向和lst2是⼀一样的. lst1改变了了, lst2也发⽣生了了改变
    
    lst1 = ["⾦金金⽑毛狮王", "紫衫⻰龙王", "⽩白眉鹰王", "⻘青翼蝠王"]
    
    lst2 = lst1 # 赋值 ,此时lst2 在内存中没有创建新对象,而是直接指向lst1的内存地址。
    print(lst1) # ['⾦金金⽑毛狮王', '紫衫⻰龙王', '⽩白眉鹰王', '⻘青翼蝠王']
    print(lst2) # ['⾦金金⽑毛狮王', '紫衫⻰龙王', '⽩白眉鹰王', '⻘青翼蝠王']
    lst1.append("杨逍")
    print(id(lst1) == id(lst2)) # True;内存地址一致,所以修改一个列表,另外一个列表内容也发生了变化
    
    print(lst1) # ['⾦金金⽑毛狮王', '紫衫⻰龙王', '⽩白眉鹰王', '⻘青翼蝠王', '杨逍']
    print(lst2) # ['⾦金金⽑毛狮王', '紫衫⻰龙王', '⽩白眉鹰王', '⻘青翼蝠王', '杨逍']
    
    
    ## 浅拷贝
    
    lst1 = ["何炅", "杜海海涛","周渝⺠民"]
    lst2 = lst1.copy()
    lst1.append("李李嘉诚")
    print(lst1) # ['何炅', '杜海海涛', '周渝⺠民', '李李嘉诚']
    print(lst2) # ['何炅', '杜海海涛', '周渝⺠民']  此时发现lst1和lst2的值不一致,
    print(id(lst1) == id(lst2)) # False 而且内存地址也不同,此时发生了内存拷贝。# 两个lst完全不一样. 内存地址和内容也不一样. 发现实现了内存的拷⻉
    
    
    lst1 = ["何炅", "杜海海涛","周渝⺠民", ["麻花藤", "⻢马芸", "周笔畅"]]
    lst2 = lst1.copy()
    lst1[3].append("⽆无敌是多磨寂寞")
    print(lst1) # ['何炅', '杜海海涛', '周渝⺠民', ['麻花藤', '⻢马芸', '周笔畅', '⽆无敌是多磨寂寞']]
    print(lst2) # ['何炅', '杜海海涛', '周渝⺠民', ['麻花藤', '⻢马芸', '周笔畅', '⽆无敌是多磨寂寞']]
    print(id(lst1) == id(lst2)) # False 此时列表的内存地址不同,看似和上面案例差不多,但是尝试查看嵌套列表的地址发现问题
    print(id(lst1[3]) == id(lst2[3])) # True 两个列表中的嵌套列表内存地址相同。所以修改lst1,lst2中的列表也发生了变化,说明lst1在copy时候只拷贝了嵌套列表的内存地址赋予lst2
    
    #  此时发现产生了浅拷贝. 只拷⻉第一层. 第二层的内容不会拷贝. 所以被称为浅拷贝
    
    
    
    ## 深拷贝
    import copy
    
    lst1 = ["何炅", "杜海海涛", "周渝⺠民", ["麻花藤", "⻢马芸", "周笔畅"]]
    lst2 = copy.deepcopy(lst1)
    lst1[3].append("⽆无敌是多磨寂寞")
    print(lst1) # ['何炅', '杜海海涛', '周渝⺠民', ['麻花藤', '⻢马芸', '周笔畅', '⽆无敌是多磨寂寞']]
    print(lst2) # ['何炅', '杜海海涛', '周渝⺠民', ['麻花藤', '⻢马芸', '周笔畅']]
    print(id(lst1) == id(lst2)) # False
    print(id(lst1[3]) == id(lst2[3])) # False 此时发现两个列表的地址和内嵌列表的地址都不同,所以修改lst1之后,lst2没有发生变化
    
    # 都不一样了了. 深度拷⻉. 把元素内部的元素完全进⾏拷⻉复制. 不会产生⼀个改变另⼀个跟着 改变的问题
    

      

  • 相关阅读:
    Linq之旅:Linq入门详解(Linq to Objects)【转】
    Shadow Map 原理和改进 【转】
    OSG 中文解决方案 【转】
    shadow mapping实现动态shadow实现记录 【转】
    RenderMonkey 练习 第六天 【OpenGL Water 水效】
    glsl水包含倒影的实现(rtt) 【转】
    Docker镜像仓库Harbor之搭建及配置
    docker登录没有配置https的harbor镜像仓库
    Git 清除远端已删除的分支
    单节点k8s的一个小例子 webapp+mysql
  • 原文地址:https://www.cnblogs.com/fanghongbo/p/9850625.html
Copyright © 2011-2022 走看看