python是一种面向对象的语言,python中对象包含三种基本要素:id(返回的是对象的地址)、type(返回的是对象的数据类型)及value(对象的值)。
在python中对象赋值给变量实际上是对象的引用。当创建一个对象,然后把它赋值给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用。
- 可变对象:对象内容本身可变,改变对象内容,对象在内存中的地址不会被改变
- 不可变对象:对象内容本身不可变,如果改变对象内容,那么对象在内存中的地址会被改变;如果必须存储一个不同的值,则必须创建新的对象
- 不可变对象:字符串、元组、数字(int、float)
- 可变对象:数组、字典、集合
--------------------------------------------------------------------------------------------------------------------------------
我们可以从上面的例子看到,对于可变对象来说,a变量的值更新之后,b变量的值也会随之更新(因为始终指向的内存地址没有变过)。那么假如我们只希望a变量的值变动,b变量的值不变动呢?就引入了拷贝(不可变对象,用赋值就可以实现该需求)。
一句话概括:浅拷贝会创建一个新对象,该新对象存储原始元素的引用
可以看到内存地址是不同的,所以给 old_list 新增一个元素并不会同步让 new_list 也新增
面试题:浅拷贝、深拷贝的区别
- 浅拷贝和深拷贝只有在可变对象才会生效,不可变对象的赋值操作、浅拷贝、深拷贝的效果是一样的
- 浅拷贝会将对象复制生成一个新对象,但新对象仍然存储原始对象的引用,当原始对象是可变对象,然后修改它的值时,新旧对象会同时改变
- 深拷贝不仅会将对象复制生成一个新对象,且所有原始对象都会复制生成新对象,即使原始对象是可变对象,新对象存储的对象引用也是新的,所以改变旧对象的可变对象时,不会影响新对象