Python--链表的深复制,浅复制

在python中,对象赋值实际上是对象的引用。当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用

一般有三种方法,

alist=[1,2,3,["a","b"]]

(1)直接赋值,传递对象的引用而已,原始列表改变,被赋值的b也会做相同的改变

b=alist
print b
[1, 2, 3, ['a', 'b']]
alist.append(5)
print alist;print b
[1, 2, 3, ['a', 'b'], 5]
[1, 2, 3, ['a', 'b'], 5]

(2)copy浅拷贝,没有拷贝子对象,所以原始数据改变,子对象会改变

import copy

c=copy.copy(alist)
print alist;print c
[1, 2, 3, ['a', 'b']]
[1, 2, 3, ['a', 'b']]
alist.append(5)
print alist;print c
[1, 2, 3, ['a', 'b'], 5]
[1, 2, 3, ['a', 'b']]

alist[3]
['a', 'b']
alist[3].append('cccc')
print alist;print c
[1, 2, 3, ['a', 'b', 'cccc'], 5]
[1, 2, 3, ['a', 'b', 'cccc']] 里面的子对象被改变了

(3)深拷贝,包含对象里面的自对象的拷贝,所以原始对象的改变不会造成深拷贝里任何子元素的改变

import copy

d=copy.deepcopy(alist)
print alist;print d
[1, 2, 3, ['a', 'b']]
[1, 2, 3, ['a', 'b']]始终没有改变
alist.append(5)
print alist;print d
[1, 2, 3, ['a', 'b'], 5]
[1, 2, 3, ['a', 'b']]始终没有改变
alist[3]
['a', 'b']
alist[3].append("ccccc")
print alist;print d
[1, 2, 3, ['a', 'b', 'ccccc'], 5]
[1, 2, 3, ['a', 'b']] 始终没有改变

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、快捷键 ctr+b 执行ctr+/ 单行注释ctr+c ...
    o_8319阅读 5,910评论 2 16
  • http://python.jobbole.com/85231/ 关于专业技能写完项目接着写写一名3年工作经验的J...
    燕京博士阅读 7,668评论 1 118
  • 当然不对!这简直就是没有很大根据的行为。 就拿某市实行禁止电动车来说,它的管理层给的理由是造成了很多的交通事故,这...
    电动车一号阅读 297评论 0 1
  • 第三章 凝固的空气 清早刚上班辛婉就告诉她让她把昨天做的营销策划案送到经理办室,听到这个消息她笑了笑,摇摇头,心...
    小鱼yym阅读 354评论 0 1
  • 克罗忠告:作为一名长期的华尔街交易商,我已经被训练成这样:在我开始谈盈利潜力之前,我们认为先谈谈涉及的风险更合适。...
    空灵一月阅读 718评论 0 1