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

    深浅拷贝

    • 1. 直接赋值. 两个变量指向同一个对象.
    • 2. 浅拷贝:只拷贝第一层内容. copy()
    • 3. 深度拷贝: 对象中的所有内容都会被拷贝一份

    拷贝比创建对象的过程要快

    赋值

    lst1 = ["金毛狮王", "紫衫龙王", ]
    lst2 = lst1  # 列表,进行赋值操作. 实际上是引用内存地址的赋值. 内存中此时只有一个列表. 两个变量指向一个列表
    lst2.append("白眉鹰王")  # 对其中的一个进行操作. 两个都跟着变
    print(lst1, id(lst1))
    print(lst2, id(lst2))

    结果:

    ['金毛狮王', '紫衫龙王', '白眉鹰王'] 55256808
    ['金毛狮王', '紫衫龙王', '白眉鹰王'] 55256808

    对于list, set, dict来说, 直接赋值. 其实是把内存地址交给变量. 并不是复制一份内容. 所以.ls2的内存指向和ls是一样的. ls改变了, ls2也发了改变

    浅拷贝

    浅拷贝 copy 创建新对象

    lst1 = ["赵本山", "刘能", "赵四"]
    lst2 = lst1.copy()  # lst2 和lst1 不是一个对象了
    lst1.append("谢大脚")
    print(lst1, id(lst1))
    print(lst2, id(lst2))

    结果:

    ['赵本山', '刘能', '赵四', '谢大脚'] 58861288
    ['赵本山', '刘能', '赵四'] 58898872

    拷贝了一个新的对象,内存地址都不一样,lst1.append("谢大脚")只是给lst1添加了

    可以用下图来表示整个过程

     在来一个例子

    lst1 = ["超人", "七龙珠", ["金城武", "渣渣辉"]]
    lst2 = lst1.copy()  # 拷贝. 浅拷贝 拷贝第一层
    lst1[2].append("大哥")
    print(lst1, id(lst1))
    print(lst2, id(lst2))

    结果:

    ['超人', '七龙珠', ['金城武', '渣渣辉', '大哥']] 53918136
    ['超人', '七龙珠', ['金城武', '渣渣辉', '大哥']] 53917096

    import copy
    names = ["aa", 'bb', ['zou', 'xx'], 'cc', 'dd', 'ee', '77']
    print(names)
    name3 = copy.copy(names)  # name3=names.copy()
    print(name3)
    names[1] = 'LL'  # 改指定位置的元素
    print(names)
    print(name3)
    names[2][0] = 'ZOU'
    print(names)
    print(name3)

    结果:

    ['aa', 'bb', ['zou', 'xx'], 'cc', 'dd', 'ee', '77']
    ['aa', 'bb', ['zou', 'xx'], 'cc', 'dd', 'ee', '77']
    ['aa', 'LL', ['zou', 'xx'], 'cc', 'dd', 'ee', '77']
    ['aa', 'bb', ['zou', 'xx'], 'cc', 'dd', 'ee', '77']
    ['aa', 'LL', ['ZOU', 'xx'], 'cc', 'dd', 'ee', '77']
    ['aa', 'bb', ['ZOU', 'xx'], 'cc', 'dd', 'ee', '77']

    Copy只copy第一个列表里的。如果列表里还有列表(只拷贝里面的内存地址),则里面的更改时copy的也会变  浅拷贝

    深 copy

    import copy
    
    lst1 = ["超人", "七龙珠", ["金城武", "渣渣辉"]]
    lst2 = copy.deepcopy(lst1)  # 把lst1扔进去进行深度拷贝 , 包括内部的所有内容进行拷贝
    lst1[2].append("大哥")
    print(lst1, id(lst1))
    print(lst2, id(lst2))

    结果:

    ['超人', '七龙珠', ['金城武', '渣渣辉', '大哥']] 46314920
    ['超人', '七龙珠', ['金城武', '渣渣辉']] 46314240

     引用import copy的deepcopy则复制的不随着更改而改变,因为内存地址也复制了一份,内存地址也改变了

    import copy
    
    names = ["aa", 'bb', ['zou', 'xx'], 'cc', 'dd', 'ee', '77']
    print(names)
    name3 = copy.deepcopy(names)
    print(name3)
    names[1] = 'LL'
    print(names)
    print(name3)
    names[2][0] = 'ZOU'
    print(names)
    print(name3)

    结果:

    ['aa', 'bb', ['zou', 'xx'], 'cc', 'dd', 'ee', '77']
    ['aa', 'bb', ['zou', 'xx'], 'cc', 'dd', 'ee', '77']
    ['aa', 'LL', ['zou', 'xx'], 'cc', 'dd', 'ee', '77']
    ['aa', 'bb', ['zou', 'xx'], 'cc', 'dd', 'ee', '77']
    ['aa', 'LL', ['ZOU', 'xx'], 'cc', 'dd', 'ee', '77']
    ['aa', 'bb', ['zou', 'xx'], 'cc', 'dd', 'ee', '77']
  • 相关阅读:
    教材代码完成情况测试P186(课上测试)
    教材代码完成情况测试P171(课上测试)
    团队作业(三):确定分工
    2018-2019-2 20175215 实验二《面向对象程序设计》实验报告
    20175215 2018-2019-2 第七周java课程学习总结
    类定义(课下选做)
    2018-2019 20175234 实验三《敏捷开发与XP实践》实验报告
    20175234 2018-2019-2 个人项目:数字黑洞(三):圣经数
    20175234 数据库MySQL(课下作业)
    20175234 2018-2019-2 《Java程序设计》第九周学习总结
  • 原文地址:https://www.cnblogs.com/zouzou-busy/p/12994694.html
Copyright © 2011-2022 走看看