目录
一、可变对象和不可变对象
二、概念
三、深浅拷贝
1.浅拷贝
2.深拷贝
可变类型:列表、字典、集合
不可变类型:整数、小数、复数、字符串、元组
= 是指向引用
浅拷贝:只拷贝父对象,不拷贝子对象
深拷贝:拷贝对象以及其子对象
copy是python的标准库
import copy
copy.copy() 浅拷贝
copy.deepcopy() 深拷贝
import copy
a = [1,2,3,4,['a', 'b'],('e','f')]
b = copy.copy(a)
print("id(a[4]),id(b[4]) :",id(a[4]),id(b[4]))
a.append(6)
b.append(7)
print("id(a[4]),id(b[4]) :",id(a[4]),id(b[4]))
print("a,b :",a,b)
print("id(a),id(b):",id(a),id(b))
b[4].append('c')
print("a,b :",a,b)
print("id(a),id(b):",id(a),id(b))
第一次打印 时,a列表和b列表里面的地址值是一样的
列表新增内容之后,浅拷贝第二次打印地址不会改变a,b列表的地址值;
第三次打印是打印a,b列表里面子列表元素的地址值;
然后b列表的子列表新增一个元素,第四次是打印一下a,b列表,可以发现两个列表的子列表都同时新增了新的元素;
第五次打印可以看到a,b列表的父对象地址值都没有发生变化;
第六次打印可以看到a,b列表的子列表的地址值是一样的,没有改变;
说以说明浅拷贝只拷贝的父对象的地址值,不会改变子对象的地址值;
深拷贝使用的是copy.deepcopy()
import copy
a = [1,2,3,['a','b']]
b = copy.deepcopy(a)
print("id(a), id(b):",id(a), id(b))
print("id(a[3]), id(b[3]):",id(a[3]), id(b[3]))
a[3].append('C')
b[3].append('d')
print(a,b)
print("id(a), id(b):",id(a), id(b))
print("id(a[3]), id(b[3]):",id(a[3]), id(b[3]))
第一次打印的是a,b列表的地址值,深拷贝情况两个列表的地址值是独立的不一样的
第二次打印的是a,b列表的子列表的地址值,深拷贝情况下子列表的地址值也是独立的不一样的;
给两个子列表新增元素后,
第三次打印的是a,b列表的地址值,保持不变;
第四次打印的是a,b列表的子列表的地址值,新增之后保持不变;
所以深拷贝时,拷贝的父对象以及其子对象的地址值都是重新生成的独立的,互不影响的