深拷贝(deepcopy)与浅拷贝(copy)的区别

1.深拷贝与浅拷贝

  • 直接赋值:其实就是对象的引用(别名)。
  • 浅拷贝(copy):是对于一个对象的顶层拷贝,拷贝父对象,不会拷贝对象的内部的子对象。
  • 深拷贝(deepcopy): 是对于一个对象所有层次的拷贝(递归),完全拷贝了父对象及其子对象。

对象的引用(内存地址)”赋值给变量的,在python中有6个标准数据类型,他们分为可变和不可变两类。

  • 不可变类型:Number(数字)String(字符串)Tuple(元组)
  • 可变类型:List(列表)Dictionary(字典)Set(集合)

浅拷贝(copy)

1.浅拷贝会创建一个新的容器对象(compound object)

2.对于对象中的元素,浅拷贝就只会使用原始元素的引用(内存地址)

常见的浅拷贝操作有:

  • 使用切片操作[:]
  • 使用工厂函数(如list/dict/set)
  • copy模块的copy()方法

注意点:

  1. copy.copy对于不可变类型,不会拷贝,仅仅是指向内存地址.
>>> a="1234567"
>>> b=a
>>> id(a)
4367619440
>>> id(b)
4367619440
>>> c=copy.copy(a)
>>> id(c)
4367619440
>>> d=copy.deepcopy(a)
>>> id(d)
4367619440

  1. copy.copy对于可变类型会进行浅拷贝,生成新的内存地址,但会出现以下两种场景:

1>拷贝对象中无可变类型元素,原对象的元素值改变不影响新对象的元素值.

2>拷贝对象中存在可变类型元素A(例如列表中的子元素是一个字典),拷贝时新对象中可变类型元素A,两者指向同一个内存地址,如果拷贝对象A的值改变,新对象A也会跟着改变.

>>> import copy
>>> list1=[1,2,['a','b']]
>>> list2=list1
>>> list3=copy.copy(list2)
>>> list4=copy.deepcopy(list3)
>>> id(list1)
4338414656
>>> id(list2)
4338414656
>>> id(list3)
4338415016
>>> id(list4)
4338414368
>>> list1[2].append('a')
>>> id(list1)
4338414656
>>> print list1
[1, 2, ['a', 'b', 'a']]
>>> print list3
[1, 2, ['a', 'b', 'a']]
>>> print list4
[1, 2, ['a', 'b']]
>>> list1.append(33)
>>> id(list1)
4338414656
>>> id(list3)
4338415016
>>> print list1
[1, 2, ['a', 'b', 'a'], 33]
>>> print list3
[1, 2, ['a', 'b', 'a']]

深拷贝(deepcopy)

1.深拷贝和浅拷贝一样,都会创建一个新的容器对象(compound object)

2.和浅拷贝的不同点在于,深拷贝对于对象中的元素,深拷贝都会重新生成一个新的对象

你可能感兴趣的:(Python,python)