python基礎 深淺copy(重點)

2022-09-15 21:30:29 字數 3143 閱讀 8579

在此申明一下,部落格參照了自己做了部分的改動

先問問大家,什麼是拷貝?拷貝是音譯的詞,其實他是從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來說,只是在記憶體中重新建立了開闢了乙個空間存放乙個新列表,但是新列表中的元素與原列表中的元素是公用的。

# 同一**塊下

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...