copy

只复制深层对象的引用,拷贝出来的新对象的地址和原对象是不一样的,但是新对象里面的可变元素(如列表)的地址和原对象里的可变元素的地址是相同的,也就是说浅拷贝它拷贝的是浅层次的数据结构(不可变元素),对象里的可变元素作为深层次的数据结构并没有被拷贝到新地址里面去,而是和原对象里的可变元素指向同一个地址,所以在新对象或原对象里对这个可变元素(如列表)做修改时,两个对象是同时改变的。

  1. import copy
  2. a = [1,2,3,4,['a','b']]
  3. b = copy.copy(a)
  4. c = copy.deepcopy(a)
  5. a[4].append(5)
  6. print(b,c)
  7. >>[1, 2, 3, 4, ['a', 'b',5]] [1, 2, 3, 4, ['a', 'b']]

deepcopy

复制深层对象本身,此时a深层对象改变了,不会影响到这个值
但是深拷贝不会这样,这个是浅拷贝相对于深拷贝最根本的区别。

  1. import copy
  2. a = [1,2,3,4,['a','b']]
  3. b = copy.copy(a)
  4. c = copy.deepcopy(a)
  5. a[4][0] = 'c'
  6. print(b,c,sep='\n')
  7. >>[1, 2, 3, 4, ['c', 'b']] #浅copy改变了
  8. [1, 2, 3, 4, ['a', 'b']] #深copy没有改变