简介深浅拷贝

深浅拷贝

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])
# 如果元组中的子对象有可变类型,是引用对对方的地址,在浅拷贝的时候回随之改变

你可能感兴趣的:(简介深浅拷贝)