Python 赋值引用、拷贝

参考文章link

变量和对象之间的关系为引用

1 第一次赋值时,即创建,之后 再次赋值 将会 改变 变量的值。
2 变量名本身是没有类型的,类型只存在对象中,变量只是引用了对象。
3 所有的变量,必须 在使用前 赋值,使用未赋值的变量会产生错误。

Python对象三要素:Id,Type,Value

Id:唯一标识一个对象
Type:标识对象的类型
Value:对象的值
== 指值相等。
is 指地址相等,即指引用相等。

变量是一个系统表的元素,拥有指向对象的连接的空间。
对象是分配的一块内存,有足够的空间去表示它们所代表的值。
引用是自动形成的从变量到对象的指针。

python里面复制对象时因对象而异,如list

values[:] 复制操作是所谓的「浅复制」(shallow copy)
存在问题:当被复制的list里有引用元素时,浅复制后的list中还是会共享改引用,导致相互干扰

1
2
3
4
5
6
a = [0, [1, 2], 3]
b = a[:]
a[0] = 8
a[1][1] = 9
#a 为 [8, [1, 9], 3],
#b 为 [0, [1, 9], 3]。

正确复制嵌套元素是进行“深复制”(deep copy)

1
2
3
4
5
6
import copy

a = [0, [1, 2], 3]
b = copy.deepcopy(a)
a[0] = 8
a[1][1] = 9

引用和拷贝

没有限制条件的分片表达式(L[:])能够复制序列,但此法只能浅层复制。

字典 copy 方法,D.copy() 能够复制字典,但此法只能浅层复制。

有些内置函数,例如 list,能够生成拷贝 list(L)。

copy 标准库模块能够生成完整拷贝:deepcopy 本质上是递归 copy。