前言:咱们在了解深浅拷贝以前首先须要明白的一点知识python
不可变类型数据:不可变类型即指当改变其内元素时,内存空间将会发生变化,好比常见的不可变类型有:str,boolean, int,tuple。app
temp = "哈哈哈" ret = temp.replace("哈", "嘿", 2) print(temp) # 哈哈哈 print(ret) # 嘿嘿哈 # 咱们能够看到temp的值并无发生改变,这就是为何对str数据改变以后须要从新赋值的缘由,由于它是不可变类型,只能从新找一个值接收。
可变类型数据:当改变其内元素时,内存空间不会发生变化,好比常见的可变类型有:list,set,dict。3d
lst = [1, 2, 3] lst.append(4) print(lst) # [1, 2, 3, 4] # 而对可变类型数据进行操做时,由于它是可变类型数据,没有改变原来的内存地址空间,因此不须要从新赋值,能够直接打印
赋值与深浅拷贝code
# 赋值 lst = [1, 2, 3, 4] lst2 = lst lst2.append(5) print(lst) # [1, 2, 3, 4, 5] print(lst2) # [1, 2, 3, 4, 5] # 由于lst是可变类型,因此在赋值时是将lst的内存地址赋值给了lst2.也就意味着它们指向了同一个内存空间,因此当其中任意一个对里面的元素进行操做时,另外一个也会改动。 # 浅拷贝 import copy lst = [1, 2, 3, ["哈哈", "嘿嘿"]] # lst2 = lst.copy() 浅拷贝 lst2 = copy.copy(lst) # 浅拷贝,两者任选其一,都是浅拷贝 print(lst2) # [1, 2, 3, ["哈哈", "嘿嘿"]] lst[3].append("嘻嘻") print(lst2) # [1, 2, 3, ["哈哈", "嘿嘿", "嘻嘻"]] # 从中咱们能够看到,当进行浅拷贝时,拷贝以后的对象并非彻底和原对象没有关系,当原对象对里面的列表进行修改时,拷贝后的对象里面的列表也跟着修改。这就称为浅拷贝。 # 当进行浅拷贝时会对里面每一个元素进行拷贝,然而当里面有一个可变类型数据时,它这时候就不是拷贝数据自己,而是拷贝的这个可变数据的内存地址,这也就能解释为何改变原有对象还能对拷贝后的对象产生影响了,由于它们自己仍是指向同一个内存地址。 # 你也能够简单理解浅拷贝:浅拷贝只拷贝第一层。 # 深拷贝 import copy lst = [1, 2, 3, ["哈哈", "嘿嘿"]] lst2 = copy.deepcopy(lst) # 深拷贝 print(lst2) # [1, 2, 3, ["哈哈", "嘿嘿"]] lst[3].append("嘻嘻") print(slt2) # [1, 2, 3, ["哈哈", "嘿嘿"]] # 深拷贝即彻底拷贝,无论里面的元素是否含有可变类型数据,拷贝的就是数据自己,而不是对象内存地址。
插图对象
浅拷贝blog
深拷贝ip
tips:图画的很糙,可能大家看了也不懂,但我就是要画 ~~内存