python中深浅拷贝
先弄懂下面概念
变量 --引用--对象--(可变对象,不可变对象)-切片-拷贝(浅拷贝,深拷贝)
变量是一个系统表的元素,拥有指向对象的链接的空间
对象是被分配的一块内存,存储其所代表的值
引用是自动形成的从变量到对象的指针
在python中不可变对象知:一旦创建就不可修改对象,包括字符创,元组,数字
在python中可变对象是指:可以修改的对象,包括:列表,字典
1.不可变对象的赋值
a的值发生改变,b不会跟着改变
a = 1 b = a print(a) print(b) a = 3 print(a) print(b) 结果: 1 1 3 1
2.可变对象的赋值
a发生改变,b也跟着改变
a = [1,2] b = a print(a) print(b) a[0] = 3 print(a) print(b) 结果: [1, 2] [1, 2] [3, 2] [3, 2]
要想b的值不会改变,就要用到copy模块
3.深浅拷贝
浅拷贝:只拷贝顶级的对象,或者说:父级对象
深拷贝:拷贝所有对象,顶级对象以及嵌套对象。或者说:父级对象以及子对象
import copy #第二种,字典中有嵌套 d = {'name':{'first':'zhang','last':'derek'}, 'job':['IT','HR']} c1 = copy.copy(d) c2 = copy.deepcopy(d) print(id(d),id(c1),id(c2)) #31157416 31940256 35946856 d['job'][0] = 'tester' print(d,c1,c2) # {'name': {'first': 'zhang', 'last': 'derek'}, 'job': ['tester', 'HR']} # {'name': {'first': 'zhang', 'last': 'derek'}, 'job': ['tester', 'HR']} # {'name': {'first': 'zhang', 'last': 'derek'}, 'job': ['IT', 'HR']} 源对象修改值的时候,浅拷贝的值跟着改变,深拷贝的值没变
import copy #第二种,字典中有嵌套 d = {'name':{'first':'zhang','last':'derek'}, 'job':['IT','HR']} c1 = copy.copy(d) c2 = copy.deepcopy(d) print(id(d),id(c1),id(c2)) #31157416 31940256 35946856 d['job'][0] = 'tester' print(d,c1,c2) # {'name': {'first': 'zhang', 'last': 'derek'}, 'job': ['tester', 'HR']} # {'name': {'first': 'zhang', 'last': 'derek'}, 'job': ['tester', 'HR']} # {'name': {'first': 'zhang', 'last': 'derek'}, 'job': ['IT', 'HR']} 源对象修改值的时候,浅拷贝的值跟着改变,深拷贝的值没变
结论:
- 深浅拷贝都是对源对象的复制,占用不同的内存空间
- 如果源对象只有一级目录的话,源做任何改动,都不会影响深浅拷贝对象
- 如果源对象不止一级目录的话,源做任何改动。都要影响浅拷贝,但不影响深拷贝
- 序列对象的切片其实是浅拷贝,即只拷贝顶级对象