编程论坛

 找回密码
 立即注册
广告联系qq1031180668广告位
查看: 127|回复: 0

[python] python深拷贝和浅拷贝

[复制链接]
  • ta_mind

    前天 21:57
  • classn_01: 71 classn_02

    [LV.6]常住居民II

    971

    主题

    1692

    帖子

    3269

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    3269

    最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

    发表于 2018-5-2 02:26:25 | 显示全部楼层 |阅读模式
    浅拷贝
    [Python] syntaxhighlighter_viewsource syntaxhighlighter_copycode
    import copy
    a=[1,2,3]
    b=a
    print(id(a))
    print(a)
    print(id(b))
    print(b)


    [Python] syntaxhighlighter_viewsource syntaxhighlighter_copycode
    结果是:
    8239944
    [1, 2, 3]
    8239944
    [1, 2, 3]

    浅拷贝是对于一个对象的顶层拷贝
    通俗的理解是:拷贝了引用,并没有拷贝内容


    深拷贝
    [Python] syntaxhighlighter_viewsource syntaxhighlighter_copycode
    import copy
    a=[1,2,3]
    b=copy.copy(a)
    print(id(a))
    print(a)
    print(id(b))
    print(b)
    


    [Python] syntaxhighlighter_viewsource syntaxhighlighter_copycode
    结果是:
    4438856
    [1, 2, 3]
    47644800
    [1, 2, 3]


    验证是否真正的拷贝了,我们修改下a的值就可以知道了。
    [Python] syntaxhighlighter_viewsource syntaxhighlighter_copycode
    import copy
    a=[1,2,3]
    b=copy.copy(a)
    a.append(4)
    print(id(a))
    print(a)
    print(id(b))
    print(b)
    


    [AppleScript] syntaxhighlighter_viewsource syntaxhighlighter_copycode
    结果是:
    3390280
    [1, 2, 3, 4]
    48578648
    [1, 2, 3]


    拷贝是成功的,可是我们如果这样呢:
    [Python] syntaxhighlighter_viewsource syntaxhighlighter_copycode
    import copy
    a=[1,2,3]
    b=[5,6,7]
    c=[a,b]
    e=copy.copy(c)
    
    a.append(4)
    print(id(c))
    print(c)
    print(id(e))
    print(e)


    [Python] syntaxhighlighter_viewsource syntaxhighlighter_copycode
    结果是:
    45826456
    [[1, 2, 3, 4], [5, 6, 7]]
    45826176
    [[1, 2, 3, 4], [5, 6, 7]]


    我们发现copy.copy()这个拷贝只是拷贝c里面a和b的引用,并没用进行深度的拷贝a和b的值。如果要做到深度拷贝到a和b的值我们需要用到
    copy.deepcopy()
    [Python] syntaxhighlighter_viewsource syntaxhighlighter_copycode
    import copy
    a=[1,2,3]
    b=[5,6,7]
    c=[a,b]
    e=copy.deepcopy(c)
    
    a.append(4)
    print(id(c))
    print(c)
    print(id(e))
    print(e)
    


    [Python] syntaxhighlighter_viewsource syntaxhighlighter_copycode
    结果是:
    47251904
    [[1, 2, 3, 4], [5, 6, 7]]
    47251584
    [[1, 2, 3], [5, 6, 7]]


    完全的深拷贝成功,由此可以知道深拷贝是对于一个对象所有层次的拷贝(递归)

    不积跬步,无以至千里
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    手机版|Archiver|小黑屋|sitemap|编程论坛 - 一个单纯的编程学习交流论坛 ( 豫ICP备15032706号 )

    GMT+8, 2018-8-19 07:40 , Processed in 1.108465 second(s), 24 queries .

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表