在写python项目的时候,遇见一个python拷贝对象的坑,在此总结记录一下python中的赋值,浅拷贝与深拷贝。
不可变数据类型:数字,字符串和元组
在python中,不可变对象的赋值,浅拷贝,深拷贝都指向同一个地址,三者没有区别:
1 | 1 n1 = |
对于不可变类型,当修改的时候会替换旧的对象,(进行新的内存分配)产生一个新的地址
元组对象比较特殊
元组是不可变对象,但是元素可以是可变对象,还是可以改变元组的元素 。
当元组元素是不可变类型时,赋值,浅拷贝,深拷贝都指向同一个地址。
当元组元素是可变类型时,赋值和浅拷贝指向同一地址,深拷贝会另辟空间。
1 | 1,2],[3,4]) sf = ([ |
可变数据类型:列表,字典和集合
一图胜千言:
1 | import copy |
注意,集合的元素不能为可变类型,所以对于集合浅拷贝和深拷贝没有区别。
总结
对于可变类型对象,赋值只是增加了一个对象的引用,它们指向内存中的同一个对象;浅拷贝会开辟新内存将对象拷贝一份,但是不会拷贝子对象;深拷贝会开辟新内存将对象拷贝后,连带子对象也拷贝,与原对象完全独立。