Python可变对象、不可变对象与浅拷贝、深拷贝

https://www.cnblogs.com/sun-haiyu/p/7096918.html

一,Python中的可变对象和不可变对象


不可变对象

该对象所指向的内存中的值不能被改变。当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址。


可变对象

该对象所指向的内存中的值可以被改变。变量(准确的说是引用)改变后,实际上是其所指的值直接发生改变,并没有发生复制行为,也没有开辟新的出地址,通俗点说就是原地改变。
Python中,

不可变类型:数值类型(int和float)、字符串str、元组tuple

可变类型:列表list、字典dict、集合set

 

https://www.jianshu.com/p/03dce38cc97e

二,深拷贝与浅拷贝

浅拷贝,copy模块里面的copy方法实现

1、对于 不可 变类型 Number String Tuple,浅复制仅仅是地址指向,不会开辟新空间。
2、对于 可 变类型 List、Dictionary、Set,浅复制会开辟新的空间地址(仅仅是最顶层开辟了新的空间,里层的元素地址还是一样的),进行浅拷贝
3、浅拷贝后,改变原始对象中为可变类型的元素的值,会同时影响拷贝对象的;改变原始对象中为不可变类型的元素的值,只有原始类型受影响。(操作拷贝对象对原始对象的也是同理)


深拷贝,copy模块里面的deepcopy方法实现

1、深拷贝,除了顶层拷贝,还对子元素也进行了拷贝(本质上递归浅拷贝)
2、经过深拷贝后,原始对象和拷贝对象所有的元素地址都没有相同的了 

3、如果有一层是可变对象,则深拷贝会拷贝每一层,新建内存

4、如果每一层都是不可变类型,深拷贝依然拷贝的是引用,不会创建新的内存。

你可能感兴趣的:(python)