Python入門 深淺拷貝

2022-08-11 19:06:12 字數 3573 閱讀 3617

首先我們在這裡先補充一下基礎資料型別的一些知識:

一.迴圈刪除

1.前面我們學了列表,字典和集合的一些操作方法:增刪改查,現在我們來看一下這個問題:

有這樣乙個列表:

lst = ['周杰倫','周潤發','周星馳','劉德華']

如果現在要求我們刪除帶'周'的元素,我們下意識會這樣做:

lst = ['周杰倫','周潤發','周星馳','劉德華']

for i in lst:

if '周' in i:

lst.remove(i)

print(lst) #['周潤發', '劉德華']

但是結果卻是不對,沒有刪乾淨,這是為什麼,這是因為python內部的機制不允許在for迴圈內部刪除元素,同樣的字典同樣如此:

dic = 

for i in dic:

if '周' in i:

dic.pop(i)

print(dic) #報錯:dictionary changed size during iteration.字典在迴圈過程中改變了大小

集合同樣,在這裡就不多說了,有興趣可以自己私底下去敲一敲.

那麼就沒辦法刪除嗎?當然有,還用上邊的例子,不過要加點東西:

dic = 

lst = #建乙個列表

for i in dic:

if '周' in i:

for l in lst: #然後迴圈這個這列表

dic.pop(l) #再刪除對應的鍵值對

print(dic) #

這樣我們就拿到了我們想要的東西了,列表也是同樣的操作,自己私下裡可以練練.

2.字串與列表

關於字串也有乙個知識點我們沒有說,

lst = ['周杰倫','周潤發','周星馳','劉德華']

s = '_'.join(lst)

print(s) #周星馳_周潤發_劉德華_周杰倫

輸出的是字串型別,如果以後有列表轉化成字串的操作就可以用join了,那與之對應的是什麼呢?

s = '周星馳_周潤發_劉德華_周杰倫'

lst = s.split('_')

print(lst) #['周杰倫','周潤發','周星馳','劉德華']

那就是我們之前說過的split,它輸出的是列表型別,把字串轉換成列表型別

我們再來補充幾個常見的陷阱問題:

陷阱1:

fromkeys()幫我們建立字典用的,把第乙個引數進行迭代,拿到每一項作為key和後面的value組合成字典

d = dict.fromkeys('張無忌','趙敏') #建立字典

print(d) #

返回的是新字典,和原來的字典沒有關係

dic = {}

d = dic.fromkeys("風扇哥", "很睏")

print(dic) # {}

print(d) #

陷阱2:

如果value是可變的資料型別,那麼其中乙個key對應的value執行的更改操作,其他的也跟著變

d = dict.fromkeys("胡辣湯", )

print(d) #

print(id(d['胡']))#32118600

print(id(d['辣']))#32118600

接下來就讓我們來看看今天最重要的內容:深淺拷貝

二.深淺拷貝

lst1 = ['周星馳','周潤發','周杰倫','劉德華']

lst2 = lst1

print(lst1)

print(lst2)

print(lst1)

print(lst2)

結果:['周星馳', '周潤發', '周杰倫', '劉德華']

['周星馳', '周潤發', '周杰倫', '劉德華']

['周星馳', '周潤發', '周杰倫', '劉德華', '梁朝偉']

['周星馳', '周潤發', '周杰倫', '劉德華', '梁朝偉']

dic =

dic1 = dic

print(dic)

print(dic1)

dic['周杰倫'] = 'jay'

print(dic)

print(dic1)

結果:

對於列表,字典,集合來說,直接賦值其實是把記憶體位址交給變數,並不是複製乙份內容,所以,lst1的內容指向和lst2是一樣的,lst1改變了,lst2也發生了改變

淺拷貝:

lst1 = ['周潤發','周星馳','周杰倫','劉德華']

lst2 = lst1.copy()

print(lst1)

print(lst2)

print(id(lst1),id(lst2))

結果:['周潤發', '周星馳', '周杰倫', '劉德華', '梁朝偉']

['周潤發', '周星馳', '周杰倫', '劉德華']

37492552 31136264

記憶體位址和內容都不一樣了,實現了拷貝

lst1 = ['周潤發','周星馳','周杰倫','劉德華',['劉嘉玲','莫文蔚','昆凌','陳慧琳']]

lst2 = lst1.copy()

print(lst1)

print(lst2)

print(id(lst1),id(lst2))

結果:['周潤發', '周星馳', '周杰倫', '劉德華', ['劉嘉玲', '莫文蔚', '昆凌', '陳慧琳', '都是美女']]

['周潤發', '周星馳', '周杰倫', '劉德華', ['劉嘉玲', '莫文蔚', '昆凌', '陳慧琳', '都是美女']]

37820232 37820232

淺拷貝拷貝的只是第一層的內容,所以才叫淺拷貝

深拷貝:

import copy

lst1 = ['周潤發','周星馳','周杰倫','劉德華',['劉嘉玲','莫文蔚','昆凌','陳慧琳']]

lst2 = copy.deepcopy(lst1)

print(lst1)

print(lst2)

print(id(lst1),id(lst2))

結果:['周潤發', '周星馳', '周杰倫', '劉德華', ['劉嘉玲', '莫文蔚', '昆凌', '陳慧琳', '都是美女']]

['周潤發', '周星馳', '周杰倫', '劉德華', ['劉嘉玲', '莫文蔚', '昆凌', '陳慧琳']]

39434696 39435656

a = [1,[2]]

a[1] = a

print(a[1])

python 深淺拷貝案例 python 深淺拷貝

深淺拷貝 對於 數字 和 字串 而言,賦值 淺拷貝和深拷貝無意義,因為其永遠指向同乙個記憶體位址 import copy a1 22255 a2 22255 print id a1 id a2 3428240 3428240 對於字典 元祖 列表 而言,進行賦值 淺拷貝和深拷貝時,其記憶體位址的變化...

python 深淺拷貝

建立乙個寬度為3,高度為4的陣列 mylist 0 3 4 0,0,0 0,0,0 0,0,0 0,0,0 但是當操作mylist 0 1 1時,發現整個第二列都被賦值,變成 0,1,0 0,1,0 0,1,0 0,1,0 list n n shallow copies of list concat...

python深淺拷貝

python 深淺拷貝 shallow copy 和 deep copy 對於乙個列表,列表裡面可以再放入乙個列表 1 若想複製這乙個列表,使用列表的普通的copy 方法,只能拷貝出列表裡表層的元素,而列表裡的列表卻無法拷貝,只能指向前乙個列表.修改拷貝出的列表裡列表裡的元素,原來的列表會發生改變....