1、可变对象、不可变对象
可变对象:一个对象在不改变其所指向的地址前提下,可以修改其所执行的地址中的值,修改值,地址不变
不可变对象:一个对象所指向的地址上的值是不能修改的,如果修改,那么新修改的值会存放在另一个地址上
可变对象:list 、dict、 set
不可变对象:tuple、 string、 int、 float、 bool
2、赋值 浅拷贝 深拷贝
赋值:赋值实际上是对象引用的传递,当创建一个对象的时候,再赋值给另外一个变量的时候,并不是将该对象赋值给另一个变量。而是把这个变量在地址空间的id地址值传递给另一个变量,简单的说就是拷贝了这个对象的引用。(修改一个的值另一个也会随之改变,因为两个变量指向同一个地址)
浅拷贝:浅拷贝是对一个对象父级(外层)的拷贝,并不会拷贝子级(内部)。使用浅拷贝的时候,分为两种情况。
浅拷贝第一种情况,如果最外层的数据类型是可变的,比如说列表,字典等,浅拷贝会开启新的地址空间去存放。但其内层还是对其原地址的引用(即使内层被修改了)
浅拷贝第二种情况,如果最外层的数据类型是不可变的,比如元组,字符串等,浅拷贝对象的时候,还是引用对象的地址空间。
深拷贝:深拷贝对一个对象是所有层次的拷贝(递归),内部和外部都会被拷贝过来
深拷贝第一种,最外层数据类型可变,内层数据也可变。这个时候,内部和外部的都会拷贝过来。
深拷贝第二种,最外层数据类型可变,内层数据不可变。这个时候,外部拷贝过来,内部引用原地址。
深拷贝第三种,外层数据类型不可变,内层是可变数据类型,会新开辟地址空间存放。(内层影响到外层了)
深拷贝第四种, 内外层都不可变,才会如同浅拷贝一样,是对地址的引用。
意义
1、浅拷贝指仅仅拷贝数据集合的第一层数据,深拷贝指拷贝数据集合的所有层
2、减少内存的使用
3、在做数据的清洗、修改或者入库的时候,对原数据进行复制一份,以防数据修改之后,找不到原数据。