標籤:不難 賦值運算 例子 二層 多少 改變 運算 地址 epc
引子:首先我們有一個賦值運算作為引子,如下
1 l1 = [1, 2, 3, [‘java‘, ‘python‘]]2 l2 = l13 l1[0] = 1114 print(l1) #輸出結果:[111, 2, 3, [‘java‘, ‘python‘]]5 print(l2) #輸出結果:[111, 2, 3, [‘java‘, ‘python‘]]6 #由上面的例子我們不難明白,python中對於賦值運算來說,l1與l2指向的是同一個地址,所以他們是完全一樣的。
1.淺拷貝copy()
1 l1 = [1, 2, 3, [‘java‘, ‘python‘]] 2 l2 = l1.copy() 3 print(l1,id(l1)) #輸出結果:[1, 2, 3, [‘java‘, ‘python‘]] 46594648 4 print(l2,id(l2)) #輸出結果:[1, 2, 3, [‘java‘, ‘python‘]] 46861728 5 6 l1[2] = 222 7 print(l1,id(l1)) #輸出結果:[1, 2, 222, [‘java‘, ‘python‘]] 46594648 8 print(l2,id(l2)) #輸出結果:[1, 2, 3, [‘java‘, ‘python‘]] 46861728 9 10 l1[1] = 33311 print(l1,id(l1)) #輸出結果:[1, 333, 222, [‘java‘, ‘python‘]] 8611285612 print(l2,id(l2)) #輸出結果:[1, 2, 3, [‘java‘, ‘python‘]] 8670757613 14 l1[3][0] = ‘c++‘15 print(l1,id(l1)) #輸出結果:[1, 333, 222, [‘c++‘, ‘python‘]] 8801336016 print(l2,id(l2)) #輸出結果:[1, 2, 3, [‘c++‘, ‘python‘]] 8860808017 #對於淺拷貝來說,第一層建立的是新的地址,然而第二層就不一樣的,輸入的改變也會影響到拷貝項的改變
2.深拷貝deepcopy
1 import copy 2 l1 = [1, 2, 3, [‘java‘, ‘python‘]] 3 l2 = copy.deepcopy(l1) 4 5 print(l1,id(l1)) #輸出結果:[1, 2, 3, [‘java‘, ‘python‘]] 57042104 6 print(l2,id(l2)) #輸出結果:[1, 2, 3, [‘java‘, ‘python‘]] 57043024 7 8 l1[2] = 222 9 print(l1,id(l1)) #輸出結果:[1, 2, 222, [‘java‘, ‘python‘]] 5704210410 print(l2,id(l2)) #輸出結果:[1, 2, 3, [‘java‘, ‘python‘]] 5704302411 12 l1[1] = 33313 print(l1,id(l1)) #輸出結果:[1, 333, 222, [‘java‘, ‘python‘]] 5704210414 print(l2,id(l2)) #輸出結果:[1, 2, 3, [‘java‘, ‘python‘]] 5704302415 16 l1[3][0] = ‘c++‘17 print(l1,id(l1)) #輸出結果:[1, 333, 222, [‘c++‘, ‘python‘]] 5704210418 print(l2,id(l2)) #輸出結果:[1, 2, 3, [‘java‘, ‘python‘]] 5704302419 #對於深拷貝deepcopy來說,無論建立多少個,這些每個之間都是獨立的,改變任意一個元素,
20 #都不會影響到其他的,無論多少層都是一樣的
python中的copy與deepcopy