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'})

posted @   最萌小胡胡  阅读(158)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
点击右上角即可分享
微信分享提示