深浅拷贝
python 直接赋值,浅拷贝和深拷贝
直接赋值
其实就是对象的引用 (可以理解成浅拷贝)
浅拷贝:
拷贝父类,不会 拷贝父类对象的 内部子对象
重要
使用列表内置的copy方法,是将新列表中的元素指向了与原列表相同的内存空间。但是,如果列表中嵌套了列表,拷贝后的列表中嵌套的列表元素指针,指向原列表中嵌套列表的整体地址,而不是指向嵌套列表中元素的内存地址。
深拷贝:
完全拷贝了父类对象和其子对象
实例A
# 浅拷贝
a = {1:[1,2,3]}
b= a.copy()
# a={1:[1,2,3]} b={1:[1,2,3]} a和b的地址也不一样
a[1].append(55)
# a={1:[1,2,3,55]} b={1:[1,2,3,55]}
# 浅拷贝不拷贝父类对象的子对象
实例B
# 深拷贝 ,导入copy模块
import copy
a = {1:[1,2,3]}
c = copy.deepcopy(a)
# a= {1:[1,2,3]}, c={1:[1,2,3]}
a[1].append(99)
# a = {1:[1,2,3,99]}
# c = {1:[1,2,3]}
# 深拷贝完全拷贝了父类对象和父类对象的子对象
实例C(综合)
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']数组对象# 输出结果
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']]
【简介深浅拷贝】深浅拷贝对元组的实例
import copy
a = (1,2,3)
b = copy.copy(a)
c = copy.deepcopy(a)
(id(a),id(b),id(c)一样的)# 如果元组里面有可变的列表时
a = (1,2,[3,4,5])
b = copy.copy(a)
c = copy.deepcopy(a)
a[2].append(99)
# 输出
a=(1,2,[3,4,5,99])
b=(1,2,[3,4,5,99])
c=(1,2,[3,4,5])
# 如果元组中的子对象有可变类型,是引用对对方的地址,在浅拷贝的时候回随之改变