在此申明一下,部落格參照了自己做了部分的改動
先問問大家,什麼是拷貝?拷貝是音譯的詞,其實他是從copy這個英文單詞音譯過來的,那什麼是copy? copy其實就是複製乙份,也就是所謂的抄乙份。深淺copy其實就是完全複製乙份,和部分複製乙份的意思。賦值是直接指向的是同乙份的位址。
l1 = [1,2,3,['zhouqian','andreas']]
l2 = l1
l1[0] = 111
print(l1) # [111, 2, 3, ['zhouqian', 'andreas']]
print(l2) # [111, 2, 3, ['zhouqian', 'andreas']]
l1[3][0] = 'jmeas'
print(l1) # [111, 2, 3, ['jmeas', 'andreas']]
print(l2) # [111, 2, 3, ['jmeas', 'andreas']]
# 總之,賦值運算表示的是兩個變數指向的是同乙個位址,它們是完全一樣的。當其中乙個變數去操作記憶體位址中的資料的時候,那麼另外乙個變數的值也會隨之發生改變。
對於賦值運算來說,l1與l2指向的是同乙個記憶體位址,所以他們是完全一樣的,在舉個例子,比如張三李四合租在一起,那麼對於客廳來說,他們是公用的,張三可以用,李四也可以用,但是突然有一天張三把客廳的的電視換成投影了,那麼李四使用客廳時,想看電視沒有了,而是投影了,對吧?l1,l2指向的是同乙個列表,任何乙個變數對列表進行改變,剩下那個變數在使用列表之後,這個列表就是發生改變之後的列表。
#同一**塊下:
l1 = [1, '周乾', true, (1,2,3), [22, 33]]
l2 = l1.copy()
print(id(l1), id(l2)) # 2798484083784 2798485369416
print(id(l1[-2]), id(l2[-2])) # 2798486119032 2798486119032
print(id(l1[-1]),id(l2[-1])) # 2798484083272 2798484083272
l1[1] = 'andreas'
print(l1[1], l2[1])
l1[2] = 'false'
print(l1[2], l2[2])
l2[0] = '3'
print(l1[0], l2[0])
# 輸出的結果為:
# andreas 周乾
# false true
# 1 3
# 不同**塊下:
>>> l1 = [1, '周乾', true, (1, 2, 3), [22, 33]]
>>> l2 = l1.copy()
>>> print(id(l1), id(l2))
1477183162120 1477183162696
>>> print(id(l1[-2]), id(l2[-2]))
1477181814032 1477181814032
>>> print(id(l1[-1]), id(l2[-1]))
1477183162504 1477183162504
對於淺copy來說,只是在記憶體中重新建立了開闢了乙個空間存放乙個新列表,但是新列表中的元素與原列表中的元素是公用的。![](https://pic.w3help.cc/10a/e3e4cb780b4d5fb06a6e2f4f2d0f9.jpeg)
# 同一**塊下
import copy
l1 = [1, 'andreas', true, (1,2,3), [22, 33]]
l2 = copy.deepcopy(l1)
print(id(l1), id(l2)) # 1878925662792 1878925662856
print(id(l1[0]),id(l2[0])) # 140705023488256 140705023488256
print(id(l1[-1]),id(l2[-1])) # 1878925910472 1878925747464
print(id(l1[-2]),id(l2[-2])) # 1878925664888 1878925664888
l1[1] = 'zhouqian'
print(l1[1], l2[1])
l1[2] = 'false'
print(l1[2], l2[2])
l2[0] = '3'
print(l1[0], l2[0])
# 輸出的結果如下:
# zhouqian andreas
# false true
# 1 3
# 不同**塊下
>>> import copy
>>> l1 = [1, '周乾', true, (1, 2, 3), [22, 33]]
對於深copy來說,列表是在記憶體中重新建立的,列表中可變的資料型別是重新建立的,列表中的不可變的資料型別是公用的。
# 補充一下知識點(面試題)
l1 = [1, 2, 3, 4, ['zhouqian']]
l2 = l1[::]
print(l2)
# 輸出的結果為:[1, 2, 3, 4, ['zhouqian', 666]]
python基礎 深淺拷貝copy
拷貝是音譯的詞,其實他是從copy這個英文單詞音譯過來的,那什麼是copy?copy其實就是複製乙份,也就是所謂的抄乙份。深淺copy其實就是完全複製乙份,和部分複製乙份的意思。1.賦值運算 1 l1 1,2,3,barry alex 2 l2 l1 34 l1 0 111 5 print l1 1...
補充 python深淺copy
name liming lilongfei duanwenchao tangeng 11 yuxiaobin name2 name.copy 淺copy,只copy第一層 print name print name2 name 1 haha 當修改name的第一層時,name2不發生變化 name ...
python 深淺copy總結
總結 總結 假設l1為原資料,l2為deepcopy後的資料 1.淺copy,只能改變第一層的記憶體位址 不可變資料型別除外 2.深copy,能夠改變第一層和第二層的記憶體位址 不可變資料型別除外 3.不可變型別,位址不會發生變化,且不可使用copy 可以使用copy.deepcopy 4.對dee...