python

导航

python深浅拷贝是什么

来源 :中华考试网 2020-10-15

   一、浅拷贝

  浅拷贝是对一个对象的顶层拷贝,通俗地讲就是:拷贝了引用,并没有拷贝内容。

  a = [1,2,3]

  print(id(a))

  b=a

  print(b)

  print(id(b))

  a.append(4)

  print(a)

  print(b)

  运行结果为:

  1965053928072

  [1, 2, 3]

  1965053928072

  [1, 2, 3, 4]

  [1, 2, 3, 4]

  二、深拷贝

  深拷贝是对于一个对象所有层次的拷贝,重新开辟内存地址。

  import copy

  a = [1,2,3]

  print(id(a))

  #使用copy模块

  b = copy.deepcopy(a)

  #打印b的内存地址

  print(id(b))

  a.append(4)

  print(a)

  print(b)

  运行结果为:

  2035157969672

  2035158105992

  [1, 2, 3, 4]

  [1, 2, 3]

  相关推荐:《Python视频教程》

  三、深浅拷贝对比

  import copy

  a = [1,2,3]

  b = [4,5,6]

  c = [a,b]

  d = c #直接赋值,浅拷贝

  print("c的内存地址为:%s"%id(c))

  print("d的内存地址为:%s"%id(d))

  #使用copy模块

  #深拷贝,重新开辟内存,并内容独立

  e = copy.deepcopy(c)

  #深拷贝,重新开辟内存,但是新内容里面仍保存原来的引用

  f = copy.copy(c)

  #打印e,f的地址

  print("e的内存地址为:%s"%id(e))

  print("f的内存地址为:%s"%id(f))

  #改变a的值

  a.append(44)

  #打印a,b,c,d,e,f

  print("a = %s"%a)

  print("b = %s"%b)

  print("c = %s"%c)

  print("d = %s"%d)

  print("e = %s"%e)

  print("f = %s"%f)

  运行结果为:

  c的内存地址为:2514746494856

  d的内存地址为:2514746494856

  e的内存地址为:2514746494920

  f的内存地址为:2514746494664

  a = [1, 2, 3, 44]

  b = [4, 5, 6]

  c = [[1, 2, 3, 44], [4, 5, 6]]

  d = [[1, 2, 3, 44], [4, 5, 6]]

  e = [[1, 2, 3], [4, 5, 6]]

  f = [[1, 2, 3, 44], [4, 5, 6]]

  说明:

  1.c和d的内存地址一样,说明是浅拷贝,两个引用指向的是同一块内存。

  2.c,e,f内存地址不一样,说明e和f都是深拷贝,都重新开辟的内存地址。

  3.在a追加了元素44之后,打印的e中并有追加44,说明深拷贝,内容独立。

  4.在a追加了元素44之后,打印的f中也追加44,说明f也重新开辟了内存,但是新内容里面保存的是原来的引用。

  四、copy对可变和不可变对象的不同

  1、可变类型使用copy

  import copy

  a = [1,2,3]

  b = copy.copy(a)

  print(id(a))

  print(id(b))

  a.append(4)

  print(a)

  print(b)

  运行结果为:

  1626677717832

  1626677715784

  [1, 2, 3, 4]

  [1, 2, 3]

  2、不可变类型使用copy

  import copy

  a = (1,2,3)

  b = copy.copy(a)

  print(id(a))

  print(id(b))

  运行结果为:

  2043444280704

  2043444280704

  简单的赋值是浅拷贝。

  copy模块里面的copy()函数可以做一层深拷贝,虽然重新开辟了新的内存,但新内存里面仍然存放得是原来的引用。

  copy模块中的deepcopy()函数是深拷贝,重新开辟了了内存,而且内存中保存了新的值。

分享到

相关资讯