不可变对象(tuple string int float bool)的赋值
a = (1, 2, 3)b = (1, 2, 3)print(a is b)#输出为:True
(1, 2, 3)为不可变对象,系统给它分配固定的内存位置,创建b的时候系统查询到已有该对象,则直接使用其地址
可变对象的赋值和拷贝
可变对象的赋值
对象的赋值是引用操作
a = [1, 2, 3]b = aa[2] = 1print(a is b)print(a)print(b)输出为:True[1, 2, 1][1, 2, 1]
a = [1, 2, 3] 将对象 [1, 2, 3]的地址赋值给a
b = a 这个是引用操作,其实a中存的是对象[1, 2, 3]的地址,所以该操作之后b中保存的也是对象 [1, 2, 3]的地址
可变对象的拷贝
浅拷贝
import copya = [1, 2, 3]b = a.copy()a[2] = 1print(a is b)print(a)print(b)输出为:False[1, 2, 1][1, 2, 3]
可以看到a和b分别指向不同的对象
深拷贝
为什么要使用深拷贝?因为浅拷贝再有些情况下是不够使用的,见下面的例子
import copya = [1, 2, [3,4]]b = a.copy()a[2][0] = 1print(a is b)print(a)print(b)输出为:False[1, 2, [1, 4]][1, 2, [1, 4]]
可以看到改变a[2][0]的时候,b[2][0]也同时被改变了。
因为a[2]存放的是对象[3, 4]的地址
b = a.copy()仅仅是简单的copy a中各个元素的值
这个时候就要使用深拷贝了
import copya = [1, 2, [3,4]]b = copy.deepcopy(a)a[2][0] = 1print(a is b)print(a)print(b)输出为:False[1, 2, [1, 4]][1, 2, [3, 4]]
可以看到改变a的时候b没有被改变
