对象赋值:其实就是对象的引用(别名)。
浅拷贝(copy):浅拷贝会创建一个新对象,该新对象存储原始元素的引用
深拷贝(deepcopy): copy 模块的 deepcopy 方法,创建一个新对象,且存储的对象引用也是新的,会把所有子元素对象也复制生成一个新对象
import copy chen_list = [[1, 2], [3, 4]] new_list = copy.copy(chen_list) chen_list[0][1]+=98 new_list[1][1]+=96 print("chen list:", chen_list, "id is :", id(chen_list)) print("New list:", new_list, "id is :", id(new_list))
执行结果:
>说明:
浅拷贝后的会产生一个新的对象:
# 深拷贝 import copy old_list = [[1, 2], [3, 4]] new_list = copy.deepcopy(old_list) old_list[0][0] += 99 old_list[1][0] += 97 print("Old list:", old_list, "old list id:", id(old_list), " old list[0] id:", id(old_list[0])) print("new list:", new_list, "new list id:", id(new_list), " new list[0] id:", id(new_list[0]))
执行结果:
>说明:
1、创建一个新对象,且存储的对象引用也是新的
2、可变对象元素(子对象)的内存地址也是不同的
面试题:浅拷贝、深拷贝的区别
1、浅拷贝和深拷贝只有在可变对象才会生效,不可变对象的赋值操作、浅拷贝、深拷贝的效果是一样的 2、浅拷贝会将对象复制生成一个新对象,但新对象仍然存储原始对象的引用,当原始对象是可变对象,然后修改它的值时,新旧对象会同时改变 3、深拷贝不仅会将对象复制生成一个新对象,且所有原始对象都会复制生成新对象,即使原始对象是可变对象,新对象存储的对象引用也是新的,所以改变旧对象的可变对象时,不会影响新对象