浅拷贝:拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已。也就是,把对象复制一遍,但是该对象中引用的其他对象我不复制
深拷贝:外围和内部元素都进行了拷贝对象本身,而不是引用。也就是,把对象复制一遍,并且该对象中引用的其他对象我也复制。实现真正的一个改变另一个不变!!(除了不可变数据类型)以列表举例
直接赋值
这种情况拷贝前后列表的地址一样,里边元素的地址也一样。对不可变数据类型修改,会导致两个列表进行修改的元素都改变,对可变数据类型的修改导致两个列表进行修改的元素都改变
等号=赋值外层与内层都是引用,所以一变都变
浅拷贝:
产生新的对象,所以大地址改变了
有3种方式:
1.切片赋值0
这种情况拷贝前后列表的地址不一样,里边元素的地址一样。对不可变数据类型修改,会导致进行修改的列表的元素地址改变,对可变数据类型的修改导致两个列表进行修改的元素都改变
2.工厂函数(list(),tuple(),dict())
这种情况拷贝前后列表的地址不一样,里边元素的地址一样。对不可变数据类型修改,会导致进行修改的列表的元素地址改变,对可变数据类型的修改导致两个列表进行修改的元素都改变
3.copy方法
这种情况拷贝前后列表的地址不一样,里边元素的地址一样。对不可变数据类型修改,会导致进行修改的列表的元素地址改变,对可变数据类型的修改导致两个列表进行修改的元素都改变
深拷贝:
deepcopy()方法
这种情况拷贝前后列表的地址不一样,里边元素的地址也不一样(不可变数据类型也不变)。对不可变数据类型修改,会导致进行修改的列表的元素地址改变,对可变数据类型的修改导致两个列表只有进行修改的那个列表元素改变
不可变数据类型不存在拷贝(改谁直接重新开辟一块内存空间,所以改谁谁变)
浅拷贝不进行数据拷贝,而是拷贝引用
深拷贝进行数据重新拷贝(除不可变数据类型)
如果元组中只有不可变类型,则不能进行拷贝