”’
關於python中列表、字典的深淺拷貝問題之前認識比較模糊,之前的筆記中其實只是區分了拷貝和賦值的問題,
今天以列表爲例重新學習一下:
關於深淺拷貝和賦值的概念:
a.直接賦值: 用等號 = ,其實就是對象的引用
b.淺拷貝: 用copy( ),拷貝父對象,但是不會拷貝內部子對象
c.深度拷貝: 用deepcopy,是採用大模塊copy中的deepcopy方法,完全拷貝父對象和子對象
”’
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import copy
def print_all_list(a=[],b=[],c=[],d=[],e=[],f=[],log=''):
print log
print "a:", a
print "b:", b
print "c:", c
print "d:", d
print "e:", e
print "f:", f
if __name__ == "__main__":
a = [0,1,2,3,[4,5,6],[7,8,9]]
b = a ## 直接賦值
c = copy.copy(a) ## 淺拷貝
d = copy.deepcopy(a) ## 深拷貝
e = list(a) ## 待測試
f = a[:] ## 待測試
print_all_list(a,b,c,d,e,f,"初始:a爲原列表,b爲賦值,c爲淺拷貝,d爲深拷貝,e&f待測試")
a.append([0,0,0])
print_all_list(a,b,c,d,e,f,"給a添加了一個列表元素[0,0,0]")
## 可以看到直接賦值的b也發生改變了,說明:a.直接賦值——就是對對象的引用
a[4].append(100)
print_all_list(a,b,c,d,e,f,"對a索引爲4的子對象[4,5,6]操作,增加一個元素100")
## 可以看到除直接賦值的情況外,淺拷貝的索引爲4的子對象也發生了變化。
## 說明淺拷貝只拷貝父對象,但是不會拷貝內部子對象。對於父對象中的子對象只是進行索引。
## 而深拷貝,則是完全創建了一個新的列表。
##最終可以看到,e=list(a)、f=a[:]兩種方式也是淺拷貝。
'''
輸出
初始:a爲原列表,b爲賦值,c爲淺拷貝,d爲深拷貝,e&f待測試
a: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9]]
b: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9]]
c: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9]]
d: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9]]
e: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9]]
f: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9]]
給a添加了一個列表元素[0,0,0]
a: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9], [0, 0, 0]]
b: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9], [0, 0, 0]]
c: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9]]
d: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9]]
e: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9]]
f: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9]]
對a索引爲4的子對象[4,5,6]操作,增加一個元素100
a: [0, 1, 2, 3, [4, 5, 6, 100], [7, 8, 9], [0, 0, 0]]
b: [0, 1, 2, 3, [4, 5, 6, 100], [7, 8, 9], [0, 0, 0]]
c: [0, 1, 2, 3, [4, 5, 6, 100], [7, 8, 9]]
d: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9]]
e: [0, 1, 2, 3, [4, 5, 6, 100], [7, 8, 9]]
f: [0, 1, 2, 3, [4, 5, 6, 100], [7, 8, 9]]
'''