可变(mutable)参数和不可变(immutable)参数
- Python中string、tuple和number是不可变对象,而dict、list等是可变对象;不可变对象在进行重新赋值的时候,实际上是将原始值丢弃,将变量指向一个新值;可变对象的可变性实质上是指更改可变对象中的子对象,比如list中的item元素的更改。
-
直接赋值:其实就是对象的引用(别名)。
- 浅拷贝:不拷贝子对象(针对子对象中的item),当子对象进行更改的时候,原始对象也会改变。常见操作:列表的切片[:]操作、list()操作,字典的copy()函数、copy模块的copy()函数(两个一模一样的双胞胎)
- 深拷贝:会拷贝子对象,当对原始对象子对象进行更改的时候,原始对象不会改变。
- 常见操作:copy模块的deepcopy()函数
浅拷贝,只是拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已。
深拷贝,外围和内部元素都进行了拷贝对象本身,而不是引用。
但是对于数字,字符串和元组类型对象,没有被拷贝的说法,即便是用深拷贝,查看id的话也是一样的,如果对其重新赋值,也只是新创建一个对象,替换掉旧的而已。