python的引用、浅拷贝与深拷贝

来源:互联网 发布:java大数字处理 编辑:程序博客网 时间:2024/05/21 17:09

引用:

a=['a',['n','100']]

b=a

c=b

b[0]='b'(此时a[0]='b',c[0]='b')


浅拷贝:完全切片[:]、list、dict等

a=['a',['n','100']]

b=list(a)

c=list(b)

b[0]='b';c[0]='c';b[1][1]='30'(此时a[1][1]='30',c[1][1]='30')为什么b[0]!=a[0]!=c[0]因为它是字符串(不可变的,拷贝时创建一个新的对象),而b[1]是个列表(可变的,拷贝时将它的引用复制了一下,所以改变里面的元素b[1][0]、b[1][1]会改变共同引用a元素c的c[1][0]、c[1][1]、a[1][0]、a[1][1])


深拷贝:copy.deepcopy()

a=['a',['n','100']]

b=copy.deepcopy(a)

c=copy.deepcopy(a)

此时a,b,c互不影响


原来python处理数据时默认采用的方式是引用,类似于C++里面的int b;int &a=b(a只是b的一个别名)

对于数字、字符串、元组等原子类型就不存在什么浅拷贝、深拷贝了(因为它是新建了一个对象,其id会改变的)


0 0