id为id()的返回值(id()函数用于获取对象的内存地址)

浅拷贝: 创建新对象,其内容是原对象的引用。
浅拷贝之所以称为浅拷贝,是它仅仅只拷贝了一层,拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已。

注:不可变类型进行浅拷贝不会给拷贝的对象开辟新的内存空间,而只是拷贝了这个对象的引用

深拷贝:和浅拷贝对应,深拷贝拷贝了对象的所有元素,包括多层嵌套的元素。深拷贝出来的对象是一个全新的对象,不再与原来的对象有任何关联。
所以改变原有被复制对象不会对已经复制出来的新对象产生影响。只有一种形式,copy模块中的deepcopy函数。


import copy
# 可变类型嵌套不可变
li = [1, 2, 3, (4, 5)]
li2 = copy.copy(li)
li3 = copy.deepcopy(li)
print(id(li)) # 140292020155008
print(id(li2)) # 140292020142720
print(id(li3)) # 140292019848048
print(id(li[3])) # 140547706136688
print(id(li2[3])) # 140547706136688
print(id(li3[3])) # 140547706136688
# 不可变类型嵌套可变
li = (1, 2, 3, [4, 5])
li2 = copy.copy(li)
li3 = copy.deepcopy(li)
print(id(li)) # 140292288466096
print(id(li2)) # 140292288466096
print(id(li3)) # 140292020280976
print(id(li[3])) # 140389731087696
print(id(li2[3])) # 140389731087696
print(id(li3[3])) # 140389731087216
总结:深浅拷贝,主要分清内存地址是否改变,就可以知道是深拷还是浅拷,更直观的方法可以用代码id()去验证