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没有发生变化
    
    # 都不一样了了. 深度拷⻉. 把元素内部的元素完全进⾏拷⻉复制. 不会产生⼀个改变另⼀个跟着 改变的问题
    

      

  • 相关阅读:
    (1)定义一个接口Compute含有一个方法int computer(int n,int m); (2)设计四个类分别实现此接口,完成+-*/运算 (3)设计一个类UseCompute,含有方法: public void useCom(Compute com, int one, int two) (4)设计一个测试类
    定义一个“点”(Point)类用来表示三维空间中的点(有三个坐标)。要求如下: (1)可以生成具有特定坐标的点对象。 (2)提供可以设置三个坐标的方法。 (3)提供可以计算该“点”距原点距离平方的方法。 (4)编写主类程序验证。
    编写一个Java程序,计算半径为3.0的圆周长和面积并输出结果
    Java泛型详解
    面向对象
    随机数
    随机数的产生
    随机数
    matplotlib 绘图实例01:正弦余弦曲线
    第05课 Linux命令初探(一)
  • 原文地址:https://www.cnblogs.com/fanghongbo/p/9850625.html
Copyright © 2011-2022 走看看