python 中深拷貝和淺拷貝的區別


  通俗的理解,淺就是外面,深就是里面。淺拷貝的意思就是只拷貝外面的一層,深拷貝就是拷貝的里面的所有。

看兩段代碼:

元組:

#!/usr/bin/env/python
# -*-coding:utf-8-*-
# authour:xiapmin_pei

import copy
#定義一個元組,元組里面有一個列表,可以理解成內部
atuple=(1,2,3,[4,5])
#將元組賦值給b
b = atuple
#淺拷貝
c = copy.copy(atuple)
#深拷貝
d = copy.deepcopy(atuple)
#打印每個對象的值
print "b is {0},c is {1},d is {2}".format(b,c,d)

#改變atuple里面內嵌的列表,給列表增加一個6
atuple[3].append(6)

print "b is {0},c is {1},d is {2}".format(b,c,d)

結果:可以看出來,將atuple賦值給b,b和atuple始終是一致的
   淺拷貝外面一層不會變,但是嵌套的列表會改變
   深拷貝只和atuple的原始一樣,不會隨着atuple的改變而改變

b is (1, 2, 3, [4, 5]), c is (1, 2, 3, [4, 5]), d is (1, 2, 3, [4, 5])
b is (1, 2, 3, [4, 5, 6]), c is (1, 2, 3, [4, 5, 6]), d is (1, 2, 3, [4, 5])

列表:

#!/usr/bin/env/python
# -*-coding:utf-8-*-
# authour:xiapmin_pei

import copy

alist = [1,2,3,[4,5]]

b = alist
c = copy.copy(alist)
d = copy.deepcopy(alist)

print "alist是{0},b是{1},  c是{2},  d是{3}".format(alist,b,c,d)

alist[3].append(6)

print "alist是{0},b是{1},  c是{2},  d是{3}".format(alist,b,c,d)

alist.append(7)

print "alist是{0},b是{1},  c是{2},  d是{3}".format(alist,b,c,d)

結果:可以看出來,將alist賦值給b,b無論怎么變化,都是和alist是一樣的
   淺拷貝copy只拷貝第一層,第一層不改變,但是嵌套的列表隨着alist的改變而改變
   深拷貝deepcopy只和原先的alist是一致的,無論alist怎么改變,deepcopy只拷貝一次原先的。

alist是[1, 2, 3, [4, 5]],b是[1, 2, 3, [4, 5]], c是[1, 2, 3, [4, 5]], d是[1, 2, 3, [4, 5]]
alist是[1, 2, 3, [4, 5, 6]],b是[1, 2, 3, [4, 5, 6]], c是[1, 2, 3, [4, 5, 6]], d是[1, 2, 3, [4, 5]]
alist是[1, 2, 3, [4, 5, 6], 7],b是[1, 2, 3, [4, 5, 6], 7], c是[1, 2, 3, [4, 5, 6]], d是[1, 2, 3, [4, 5]]

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM