python的深浅拷贝

时间:2020-09-15 21:05:15   收藏:0   阅读:33

(1)当a中没有子对象时

import copy
a = [1, 2, 3, 4, "hello"]

b = a #直接赋值
c = copy.copy(a)  #浅拷贝
d = copy.deepcopy(a)  #深拷贝
a.append(5)
a.remove("hello")
a.append("aa")
#a[4].append(‘c‘)

print("更新值a=",a)
print("赋值  b=",b)    #赋值时,当a改变时,b也改变
print("浅拷贝c=",c)    #a和b是独立的对象,但是子对象指向同一个对象,如果子对象是一个列表,那么列表里的值会和a的相同
print("深拷贝d=",d)    #a和b完全是独立的对象,子对象父对象都是独立的

运行结果:

更新值a= [1, 2, 3, 4, 5, ‘aa‘]
赋值 b= [1, 2, 3, 4, 5, ‘aa‘]
浅拷贝c= [1, 2, 3, 4, ‘hello‘]
深拷贝d= [1, 2, 3, 4, ‘hello‘]

此时,浅拷贝和深拷贝没有区别,都跟改变之前一样

(2)当a中有子对象时,子对象为可变数据类型(例如列表和字典)

import copy
a = [1, 2, 3, 4, {1:"hello",2:"cc"}]

b = a #直接赋值
c = copy.copy(a)  #浅拷贝
d = copy.deepcopy(a)  #深拷贝
a.append(5)
a[4][3] = "ddd"
#a[4].append(‘c‘)

print("更新值a=",a)
print("赋值  b=",b)    #赋值时,当a改变时,b也改变
print("浅拷贝c=",c)    #a和b是独立的对象,但是子对象指向同一个对象,如果子对象是一个列表,那么列表里的值会和a的相同
print("深拷贝d=",d)    #a和b完全是独立的对象,子对象父对象都是独立的

运行结果:

更新值a= [1, 2, 3, 4, {1: ‘hello‘, 2: ‘cc‘, 3: ‘ddd‘}, 5]
赋值 b= [1, 2, 3, 4, {1: ‘hello‘, 2: ‘cc‘, 3: ‘ddd‘}, 5]
浅拷贝c= [1, 2, 3, 4, {1: ‘hello‘, 2: ‘cc‘, 3: ‘ddd‘}]
深拷贝d= [1, 2, 3, 4, {1: ‘hello‘, 2: ‘cc‘}]

浅拷贝中: 子对象跟着一起更新了,但是5没有被添加进来

深拷贝中:还是跟a的初始值一样

 

可变数据类型:列表,字典,集合

不可变数据类型:数字,字符串,元组

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!