Python中的深浅拷贝
1.在了解深浅拷贝之前,我们先明确Python中的可变与不可变
- 不可变类型:只要改变变量的值则地址发生变化,则认为此类型是不可变的
1
2
3 1 int str float tuple bool
2
3
- 可变类型:内容发生改变,但是地址没有改变,则认为此类型是可变的
1
2
3 1 list set dict
2
3
拷贝:其实就是将容器内数据,备份一份到新的地址
2.浅拷贝 copy.copy()
-
可变类型共用的是同一个(里面的内容改变,但是地址是不会改变)
-
不可变类型一开始是共用的,但是如果有发生改变的则地址就会发生改变了
1
2
3
4
5
6
7
8 1lst0 = [0,1,[1,2,3]]
2lst5 = lst0.copy() //[0,1,[1,2,3]]
3lst0 == lst5 //True
4lst0[2] [1] = 4 //[0,1,[1,4,3]]
5print(lst5) //[0,1,[1,4,3]]
6lst5 ==lst0 //True
7
8
可以看出在浅拷贝中一个列表中的嵌套列表的值改变之后,另一个列表会相应的改变!
因为它们嵌套的列表使用的是同一个内存地址
代码看的不是很明显,我们直接看图↓
3.深拷贝 copy.deepcopy()
列表中可变类型的元素,会有一个新的地址,而不是像浅拷贝一样共用一个地址
1
2
3
4
5
6
7
8
9 1import copy # 此处需要引入copy
2lst0 = [0,1,[1,2,3]]
3lst5 = copy.deepcopy(lst0) //[0,1,[1,2,3]]
4lst0 == lst5 //True
5lst0[2] [1] = 4
6print(lst5) //[0,1,[1,2,3]]
7 // 可以看出深拷贝和浅拷贝不一样之处在于对于嵌套的引用部分会独自分配内存!
8
9
tip:切片操作类似浅拷贝
总结
1、Python中对象的赋值都是进行对象引用(内存地址)的传递。
2、浅拷贝它拷贝了对象,但对于对象中的元素,依然使用的是原始的引用(内存地址),但所含元素(父对象)的子元素(子对象)不会被拷贝。
3、深拷贝可将父对象和子对象进行拷贝。