不可变对象(tuple string int float bool)的赋值

  1. a = (1, 2, 3)
  2. b = (1, 2, 3)
  3. print(a is b)
  4. #输出为:True

(1, 2, 3)为不可变对象,系统给它分配固定的内存位置,创建b的时候系统查询到已有该对象,则直接使用其地址

可变对象的赋值和拷贝

可变对象的赋值

对象的赋值是引用操作

  1. a = [1, 2, 3]
  2. b = a
  3. a[2] = 1
  4. print(a is b)
  5. print(a)
  6. print(b)
  7. 输出为:
  8. True
  9. [1, 2, 1]
  10. [1, 2, 1]

a = [1, 2, 3] 将对象 [1, 2, 3]的地址赋值给a
b = a 这个是引用操作,其实a中存的是对象[1, 2, 3]的地址,所以该操作之后b中保存的也是对象 [1, 2, 3]的地址

可变对象的拷贝

如果需要另外复制一份对象就要使用copy操作

浅拷贝

  1. import copy
  2. a = [1, 2, 3]
  3. b = a.copy()
  4. a[2] = 1
  5. print(a is b)
  6. print(a)
  7. print(b)
  8. 输出为:
  9. False
  10. [1, 2, 1]
  11. [1, 2, 3]

可以看到a和b分别指向不同的对象

深拷贝

为什么要使用深拷贝?因为浅拷贝再有些情况下是不够使用的,见下面的例子

  1. import copy
  2. a = [1, 2, [3,4]]
  3. b = a.copy()
  4. a[2][0] = 1
  5. print(a is b)
  6. print(a)
  7. print(b)
  8. 输出为:
  9. False
  10. [1, 2, [1, 4]]
  11. [1, 2, [1, 4]]

可以看到改变a[2][0]的时候,b[2][0]也同时被改变了。
因为a[2]存放的是对象[3, 4]的地址
b = a.copy()仅仅是简单的copy a中各个元素的值
这个时候就要使用深拷贝了

  1. import copy
  2. a = [1, 2, [3,4]]
  3. b = copy.deepcopy(a)
  4. a[2][0] = 1
  5. print(a is b)
  6. print(a)
  7. print(b)
  8. 输出为:
  9. False
  10. [1, 2, [1, 4]]
  11. [1, 2, [3, 4]]

可以看到改变a的时候b没有被改变