」』
關於python中列表、字典的深淺拷貝問題之前認識比較模糊,之前的筆記中其實只是區分了拷貝和賦值的問題,
今天以列表為例重新學習一下:
關於深淺拷貝和賦值的概念:
a.直接賦值: 用等號 = ,其實就是物件的引用
b.淺拷貝: 用copy( ),拷貝父物件,但是不會拷貝內部子物件
c.深度拷貝: 用deepcopy,是採用大模組copy中的deepcopy方法,完全拷貝父物件和子物件
」』
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import copy
defprint_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待測試")
print_all_list(a,b,c,d,e,f,"給a新增了乙個列表元素[0,0,0]")
## 可以看到直接賦值的b也發生改變了,說明:a.直接賦值——就是對物件的引用
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]]
'''
js 淺拷貝直接賦值 js的賦值與淺拷貝 深拷貝
昨天翻了下陣列api,看到concat和slice方法,突然想到這個兩個方法是淺拷貝還是深拷貝,結果陷入了死胡同,為什麼mdn文件說是淺拷貝,但進行簡單的操作為什麼能複製成功啊,糾結半天後才弄清原由,原來我一直把賦值和深淺拷貝搞混了。首先不要把引用型別的賦值歸結為淺拷貝,深拷貝和淺拷貝只針對像 ob...
Python 列表的 賦值拷貝 淺拷貝與深拷貝
一 文字說明 在對原有列表進行操作的時候,很有可能會修改原有列表的值,所以根據需要在這之前最好先將原有列表拷貝乙份,在對它的副本進行操作,而原列表保持不變。這個時候就需要注意 如何拷貝 的問題,因為它牽扯到 對於你新拷貝出來的列表進行操作是否還是會修改原有列表的值。通過學習,我有以下總結,對於列表一...
Python 賦值 淺拷貝 深拷貝
賦值 a b,只拷貝了物件的引用,沒有拷貝內容。兩個物件的id一樣 淺拷貝 copy.copy 構造乙個新的復合物件,然後將子物件引用插入到原始物件的副本中。深拷貝 copy.deepcopy 構造乙個新的復合物件,然後遞迴地將子物件副本插入原始物件的副本。給個栗子 從這個栗子可以看出,對c進行修改...