首先我們在這裡先補充一下基礎資料型別的一些知識:
一.迴圈刪除
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 copylst1 = ['周潤發','周星馳','周杰倫','劉德華',['劉嘉玲','莫文蔚','昆凌','陳慧琳']]
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 方法,只能拷貝出列表裡表層的元素,而列表裡的列表卻無法拷貝,只能指向前乙個列表.修改拷貝出的列表裡列表裡的元素,原來的列表會發生改變....