Python 中的拷贝与赋值总结
一、一些概念
1.1 对象
Python 中,一切皆对象。对象是一种数据抽象或数据结构抽象,是存在内存中的可变或不可变的数据结构,本质上是内存中的一块区域。
一个对象包含属性和方法。对象三大基本特征:本征值(identity),类型(type),值(value)。一个对象被创建后,它的本征值就定了,通常本征值指的是内存地址。
1.2 变量
变量是一块内存空间,这块空间存储的是内存地址,变量名是字符串名称,是一段内存地址的标识符。变量中的变指的是其所存储地址的变化,而不是所存储地址所指向内存空间的值发生变化。
变量名本身没有类型,类型只存在对象中,变量只是引用了对象。
1.3 引用
Python 使用引用来管理内存和处理对象。变量和对象有各自的存储空间,两者相互独立。变量存储对象的内存地址,即把对象的地址写入变量,即创建了一个引用。变量和对象创建引用后,可以通过变量名来访问对象的属性和方法。
举个例子,定义变量 var = 123,程序会在内存当中开辟一块空间存储整形数据123,然后把该空间的地址存储到var中,所以实际上var是123的引用。
1.4 可变对象和不可变对象
可变对象与不可变对象的本质在于变量所引用对象的内存地址不改变时,其所指向的值是否可变。
可变对象:变量存储的内存地址不变时,所存储地址指向的值可以变化。
不可变对象:变量存储的内存地址不变时,所存储地址指向的值不能变。
变量引用不可变对象并不代表变量的值不能改变,只是在数据改变的同时,变量存储的内存地址也变了。
可变数据类型:字典,列表,集合。
不可变数据类型:整形,浮点型,字符串,元组。
二、拷贝和赋值
2.1 赋值
用 “=” 来进行赋值。赋值就是创建变量和对象之间的引用,把对象的地址写入变量。
2.2 拷贝
拷贝就是为原始对象创建一个新对象,需要申请一块新内存。
浅拷贝:浅拷贝会创建一个新对象副本,然后用原始对象中的子对象的引用来填充新对象,而不会为子对象创建一块新内存。
浅拷贝的实现:
import copy
b = copy.copy(a) # 浅拷贝
深拷贝:深拷贝创建一个新对象副本,并且递归地为原始对象中所有的子对象创建副本。新对象和原始对象完全独立。
深拷贝的实现:
import copy
b = copy.deepcopy(a) # 深拷贝
三、一些例子
3.1 列表
切片:浅拷贝。
工厂函数 list():浅拷贝。
copy.copy():浅拷贝。
copy.deeycopy():深拷贝。
3.2 ndarray
切片:浅拷贝。
numpy.copy():深拷贝。