• python深复制和浅复制


    1. 对于可变对象如:列表、字典,直接赋值时只会将一个对象的引用传递给另一个对象,此时修改其中一个对象就会改变另一个对象,如:

      >>> a = [1,2,3]

      >>> b = a

      >>> a,b

      ([1, 2, 3], [1, 2, 3])

      >>> a[0]=100

      >>> a,b

      ([100, 2, 3], [100, 2, 3])

    2. 大多数情况下,一个可变对象内还可以嵌套其它可变对象,此时浅复制只会复制顶级对象,而对于嵌套的对象,只会复制它的引用,所以修改顶级对象不会影响另一个对象,但是如果修改嵌套的对象就会影响两个对象了:

      >>> a = [1,2,3, ["Aaron", "Tom"]]

      >>> b = a.copy()

      >>> a,b

      ([1, 2, 3, ['Aaron', 'Tom']], [1, 2, 3, ['Aaron', 'Tom']])

      >>> a[1]=100

      >>> a,b

      ([1, 100, 3, ['Aaron', 'Tom']], [1, 2, 3, ['Aaron', 'Tom']])

      >>> b[3][1]="Jacky"

      >>> a,b

      ([1, 100, 3, ['Aaron', 'Jacky']], [1, 2, 3, ['Aaron', 'Jacky']])

    3. 由此可见,在浅复制的情况下修改顶级元素不会影响另一个对象,但是修改内部可变元素时就会同时修改原始对象与新对象了,为了解决这个问题字典提供了一个深复制方法。深复制就是将顶级对象以及子对象的值同时复制给新对象,此时修改任何一个都不会影响另一个。

      由于字典也是可变对象,所以copy方法也遵循以上原则。

      如果想对字典进行深复制操作,需要引用copy包中的deepcopy方法:

      >>> from copy import deepcopy

      >>> a = {"Aaron":"0001", "Tom":"0002", "Kate":"0003", "Richard":"0004"}

      >>> b = deepcopy(a)

      >>> a,b

      ({'Aaron': '0001', 'Tom': '0002', 'Kate': '0003', 'Richard': '0004'}, {'Aaron':

      '0001', 'Tom': '0002', 'Kate': '0003', 'Richard': '0004'})

      >>> a["Aaron"]="1"

      >>> a,b

      ({'Aaron': '1', 'Tom': '0002', 'Kate': '0003', 'Richard': '0004'}, {'Aaron': '00

      01', 'Tom': '0002', 'Kate': '0003', 'Richard': '0004'})

  • 相关阅读:
    【转】Maven实战(九)---模块聚合和继承
    【转】Maven实战(八)---模块划分
    Oracle ORA-01034,ORA-27101,ORA-00600
    【spring源代码分析】--Bean的解析与注冊
    ArcGIS For Flex报错
    江西省委常委赵智勇被免 无被查字眼 媒体推測窝案
    软考——(4)数据库
    matlab 2014a 改为英文版本号
    POJ 2299 Ultra-QuickSort (求序列的逆序对数)
    工厂方法模式(factory method pattern)
  • 原文地址:https://www.cnblogs.com/xiaohuhu/p/9713595.html
Copyright © 2020-2023  润新知