python的直接赋值、浅拷贝和深度拷贝

直接赋值

就是赋值了对象的引用(别名)。

image-20210329105719649

浅拷贝

拷贝父对象,不会拷贝对象的内部的子对象

增加了一个指针指向已存在的内存地址

只会将对象的各个属性进行复制,并不会进行递归复制

a = {1: [1,2,3]}
b = a.copy()
a, b	# ({1: [1, 2, 3]}, {1: [1, 2, 3]})

a[1].append(4)	# 将a中的列表对象改变了,所以b中的也会变
a, b	# ({1: [1, 2, 3, 4]}, {1: [1, 2, 3, 4]})

这里的对a进行添加后,b也跟着一起变了

image-20210329105754842

深拷贝

copy 模块的 deepcopy()方法,完全拷贝了父对象及其子对象

增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存

不仅将原对象的各个属性逐个复制出去,而且将原对象各个属性所包含的对象也依次采用深复制的方法递归复制到新对象上

import copy	 # 深度拷贝需要引入 copy 模块
c = copy.deepcopy(a)
a, c	# ({1: [1, 2, 3, 4]}, {1: [1, 2, 3, 4]})

a[1].append(5)
a, c	# ({1: [1, 2, 3, 4, 5]}, {1: [1, 2, 3, 4]})

这里对a添加后,b并没有改变

image-20210329105846995

例子

import copy
a = [1, 2, 3, 4, ['a', 'b']] #原始对象
 
b = a                       #赋值,传对象的引用
c = copy.copy(a)            #对象拷贝,浅拷贝
d = copy.deepcopy(a)        #对象拷贝,深拷贝
 
a.append(5)                 #修改对象a
a[4].append('c')            #修改对象a中的['a', 'b']数组对象
 
print( 'a = ', a )
print( 'b = ', b )
print( 'c = ', c )
print( 'd = ', d )

结果:

('a = ', [1, 2, 3, 4, ['a', 'b', 'c'], 5])
('b = ', [1, 2, 3, 4, ['a', 'b', 'c'], 5])
('c = ', [1, 2, 3, 4, ['a', 'b', 'c']])
('d = ', [1, 2, 3, 4, ['a', 'b']])
posted @ 2021-03-29 11:01  feifan666  阅读(79)  评论(0)    收藏  举报