华南俳烁实业有限公司

python

當前位置:中華考試網(wǎng) >> python >> python編程基礎 >> 文章內(nèi)容

python深淺拷貝是什么

來源:中華考試網(wǎng)  [2020年10月15日]  【

   一、淺拷貝

  淺拷貝是對一個對象的頂層拷貝,通俗地講就是:拷貝了引用,并沒有拷貝內(nèi)容。

  a = [1,2,3]

  print(id(a))

  b=a

  print(b)

  print(id(b))

  a.append(4)

  print(a)

  print(b)

python課程免費試聽預約

  • 地區(qū):
  • 姓名:
  • 手機:

  運行結(jié)果為:

  1965053928072

  [1, 2, 3]

  1965053928072

  [1, 2, 3, 4]

  [1, 2, 3, 4]

  二、深拷貝

  深拷貝是對于一個對象所有層次的拷貝,重新開辟內(nèi)存地址。

  import copy

  a = [1,2,3]

  print(id(a))

  #使用copy模塊

  b = copy.deepcopy(a)

  #打印b的內(nèi)存地址

  print(id(b))

  a.append(4)

  print(a)

  print(b)

  運行結(jié)果為:

  2035157969672

  2035158105992

  [1, 2, 3, 4]

  [1, 2, 3]

  相關(guān)推薦:《Python視頻教程》

  三、深淺拷貝對比

  import copy

  a = [1,2,3]

  b = [4,5,6]

  c = [a,b]

  d = c #直接賦值,淺拷貝

  print("c的內(nèi)存地址為:%s"%id(c))

  print("d的內(nèi)存地址為:%s"%id(d))

  #使用copy模塊

  #深拷貝,重新開辟內(nèi)存,并內(nèi)容獨立

  e = copy.deepcopy(c)

  #深拷貝,重新開辟內(nèi)存,但是新內(nèi)容里面仍保存原來的引用

  f = copy.copy(c)

  #打印e,f的地址

  print("e的內(nèi)存地址為:%s"%id(e))

  print("f的內(nèi)存地址為:%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)

  運行結(jié)果為:

  c的內(nèi)存地址為:2514746494856

  d的內(nèi)存地址為:2514746494856

  e的內(nèi)存地址為:2514746494920

  f的內(nèi)存地址為: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的內(nèi)存地址一樣,說明是淺拷貝,兩個引用指向的是同一塊內(nèi)存。

  2.c,e,f內(nèi)存地址不一樣,說明e和f都是深拷貝,都重新開辟的內(nèi)存地址。

  3.在a追加了元素44之后,打印的e中并有追加44,說明深拷貝,內(nèi)容獨立。

  4.在a追加了元素44之后,打印的f中也追加44,說明f也重新開辟了內(nèi)存,但是新內(nèi)容里面保存的是原來的引用。

  四、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)

  運行結(jié)果為:

  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))

  運行結(jié)果為:

  2043444280704

  2043444280704

  簡單的賦值是淺拷貝。

  copy模塊里面的copy()函數(shù)可以做一層深拷貝,雖然重新開辟了新的內(nèi)存,但新內(nèi)存里面仍然存放得是原來的引用。

  copy模塊中的deepcopy()函數(shù)是深拷貝,重新開辟了了內(nèi)存,而且內(nèi)存中保存了新的值。

責編:hym
  • 會計考試
  • 建筑工程
  • 職業(yè)資格
  • 醫(yī)藥考試
  • 外語考試
  • 學歷考試
吉隆县| 渭源县| 缙云县| 林芝县| 桃园县| 隆昌县| 神木县| 安泽县| 察雅县| 定南县| 新平| 共和县| 白山市| 颍上县| 五台县| 通江县| 横山县| 锡林郭勒盟| 东港市| 炉霍县| 腾冲县| 化隆| 图们市| 郑州市| 惠东县| 本溪| 嵩明县| 贵港市| 蒙阴县| 蓝山县| 屏南县| 家居| 石渠县| 贵港市| 新沂市| 金塔县| 慈溪市| 军事| 桂东县| 海晏县| 兴国县|