• python浅谈浅拷贝与深拷贝


    浅拷贝

        1.=浅拷贝

            =浅拷贝相当于引用,直接进行赋值,原对象改变,则被赋值的对象也会有相同的改变。

    a = [1, 2, 3, 4, ['a', 'b'], {"one": "1", "two": "2"}, ("1","2")]
    b = a
    print(a)  # [1, 2, 3, 4, ['a', 'b'], {'one': '1', 'two': '2'}, ('1', '2')]
    print(b)  # [1, 2, 3, 4, ['a', 'b'], {'one': '1', 'two': '2'}, ('1', '2')]
    a.append(5)  
    print(id(a))  # 2899538518152 
    print(id(b))  # 2899538518152

            当然这个id值是会变化的,你每次运行程序,可能id都会变化

        2.copy浅拷贝

            使用copy模块中的copy函数进行浅拷贝,对原对象进行复制,整体使用的是新的对象地址,但是其内部子对象,使用的还是原对象中的子对象的地址,并且,如果该子对象是个不可变对象,例如:元组、数值和字符串,在对该子对象修改后,浅拷贝的中的子对象不会发生改变,但是如果该子对象是个可变对象,例如:列表,字典和集合,则会在子对象修改后,发生改变。

    a = [1, 2, 3, 4, ['a', 'b'], {"one": "1", "two": "2"}, ("1","2")]
    b = copy.copy(a)
    a.append(5)
    a[4].append("c")
    print(a)  # [1, 2, 3, 4, ['a', 'b', 'c'], {'one': '1', 'two': '2'}, ('1', '2'), 5]
    print(b)  # [1, 2, 3, 4, ['a', 'b', 'c'], {'one': '1', 'two': '2'}, ('1', '2')]
    a[6] = ("1","2","3")
    print(a)  # [1, 2, 3, 4, ['a', 'b', 'c'], {'one': '1', 'two': '2'}, ('1', '2', '3'), 5]
    print(b)  # [1, 2, 3, 4, ['a', 'b', 'c'], {'one': '1', 'two': '2'}, ('1', '2')]
    print(id(a))  # 2326873163144
    print(id(b))  # 2326873162440

    深拷贝

            深拷贝则更加严格,则是完全进行拷贝,重新创建了一个对象,并且复制了原对象的值。对原对象进行修改,也不会影响到新对象。

    a = [1, 2, 3, 4, ['a', 'b'], {"one": "1", "two": "2"}, ("1","2")]
    c = copy.deepcopy(a)
    a.append(5)
    a[4].append("c")
    print(a)  # [1, 2, 3, 4, ['a', 'b', 'c'], {'one': '1', 'two': '2'}, ('1', '2'), 5]
    print(c)  # [1, 2, 3, 4, ['a', 'b'], {'one': '1', 'two': '2'}, ('1', '2')]
    a[6] = ("1","2","3")
    print(a)  # [1, 2, 3, 4, ['a', 'b', 'c'], {'one': '1', 'two': '2'}, ('1', '2', '3'), 5]
    print(c)  # [1, 2, 3, 4, ['a', 'b'], {'one': '1', 'two': '2'}, ('1', '2')]
    print(id(a))  # 2326873163144
    print(id(c))  # 2326873165704


    总结:

    • 如果只是想使用相同的值,但是不需要考虑原对象是否收到新对象修改的影响时,可以选择直接使用等号来进行浅拷贝。
    • 如果想对新对象修改的同时不影响原对象,并且原对象中无可变子对象,则可以使用copy模块中的copy方法。
    • 如果原对象中有可变子对象,又想进行第二部的操作,可以直接使用copy模块中的deepcopy方法。




  • 相关阅读:
    Linux下修改HOSTNAME
    IBM服务器 IMM日志收集
    X3850 Linux 下DSA日志收集办法
    Linux查看进程内存占用及内存使用情况
    集成开发注意事项(持续更新)
    SOAPUI请求及mockservice 使用
    Linux下su与su -命令的区别
    从XML文件中获取格式化的文本信息
    前端实现下载文件
    动态表单如何对部分表单字段校验
  • 原文地址:https://www.cnblogs.com/GF66/p/9785480.html
Copyright © 2020-2023  润新知