Python中的深浅拷贝
一、可变数据类型和不可变数据类型
1、不可变数据类型:字符串、数值、元祖
所有值相同的不可变数据类型都指向同一个内存空间,当对某个不可变数据类型赋值的时候,实际上是指向了另一块内存空间。
a = 1 b = a print(a) #1 print(b) #1 #a和b的值相同,指向同一块内存空间 a = 2 print(a) #2 print(b) #1 #a和b的值不同,指向不同的内存空间,b没变,只是a指向了另一个空间
2、可变数据类型:列表、字典、集合
对于可变数据类型的操作不会改变其指向的内存地址,但是直接赋值还是会改变。
l1 = [111,222] l2 = l1 #l1和l2都是[111,222] l1.append(333) #l1和l2都变成[111,222,333] l1 = [111] #l1变了,l2不变
二、赋值和深浅拷贝
1、=赋值
在python中,=赋值的双方完全共享同一块内存空间,如果是可变数据类型,那么一方的改动会影响另一方。
2、浅拷贝
浅拷贝开辟一块新的内存空间,保存同样的数据内容,一方在第一层的改动不会影响另一方,但是在第二层及以下的改动仍然会影响。举例,[111,222,[1,2,3]],这样一个列表,如果浅拷贝后对这个列表里的列表进行改动,仍然会影响另一方。
因为浅拷贝对于子对象只是复制了其指向的内存地址,所以仍然会影响源数据。
浅拷贝通过copy.copy()使用
3、深拷贝
深拷贝不仅开辟一块新的内存空间,复制同样的内容,且对子对象也复制一份,开辟一块内存空间,这样双方指向的都是完全不同的地址,任何改动都不影响双方。
深拷贝通过copy.deepcopy()使用