python的深浅拷贝

2021-03-29 21:27

阅读:561

标签:一起   初始   相同   div   pen   没有   数据   引用   就是   

  • 直接赋值:其实就是对象的引用(别名)。

  • 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。

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

(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的初始值一样

 

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

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

python的深浅拷贝

标签:一起   初始   相同   div   pen   没有   数据   引用   就是   

原文地址:https://www.cnblogs.com/polly-chen/p/13599613.html


评论


亲,登录后才可以留言!