1. 程式人生 > >python的深淺拷貝以及fromkeys的用法

python的深淺拷貝以及fromkeys的用法

1.join()的用法:使用前面的字串.對後面的列表進行拼接,拼接結果是一個字串
# lst = ["alex","dsb",'wusir','xsb']
# s = "".join(lst)
# print(s)  #alexdsbwusirxsb

2.

split()  根據你給的引數進行切割,切割的結果就是列表
需要把字串轉換成列表 split
把列表轉化為字串 join
# s = "alex_dsb_wusir_xsb"
# lst = s.split("_") #列表
# print(lst)

3.join的迭代拼接

# print("*".join("周潤發")) #用迭代的方式進行拼接
# #周*潤*發

4.刪除操作

# lst = ["籃球","排球","乒乓球","足球","電子競技","檯球"]
# for el in lst:
#     lst.remove(el)
# print(lst)#['排球', '足球', '檯球']

 

  會發現刪不乾淨 原因是:刪除一個.元素的索引重新排序,for迴圈向後走一個,就漏掉一個
刪掉了索引是0的元素,然後索引是1的元素補充到索引為0的位置上,然後索引指向1,
就漏掉了以前的索引為1的元素 因為索引為一的元素在第二次迴圈的時候已經掉到了索引0的位置
正確的刪除操作:
#lst = ["籃球","排球","乒乓球","足球","電子競技","檯球"]
# for i in range(len(lst)): #0,1,2,3,4
# lst.pop(0) # print(lst) #[] #永遠刪索引是0元素 # for i in range(len(lst)): # lst.pop() # print(lst) #[] #從最後一個刪
最合理的刪除方法:
1,先把需要刪除的元素寫在一個新的列表中
2.迴圈這個新列表,刪除老列表

5.fromkeys()用法
 fromkeys() 幫我們建立字典用
# 把第一個引數進行迭代 拿到的每一項作為key和後面的value組成字典
# d = dict.fromkeys("張無忌","趙敏") #建立字典
# print(d)#{'張': '趙敏', '無': '趙敏', '忌': '趙敏'}
坑 1
# 返回新字典,和原來的字典沒有關係
# dic = {}
# d = dic.fromkeys("風扇哥","很困")
# print(dic)# {}
# print(d)#{'風': '很困', '扇': '很困', '哥': '很困'}

 



# 坑2
# 如果value是可變的資料型別,
# 那麼其中一個key對應的value執行更改操作,其他的也跟著改變
d = dict.fromkeys("胡辣湯",[])
print(d)#{'胡': [], '辣': [], '湯': []}
# print(id(d["胡"]))#1797375051912
# print(id(d["辣"]))#1797375051912
# print(id(d["湯"]))#1797375051912
#說明這幾個還是同一個[]  所以對其中一個進行改變別的也進行相應的改變
# d["胡"] .append("湖南特色")
# print(d)#{'胡': ['湖南特色'], '辣': ['湖南特色'], '湯': ['湖南特色']}
 
6.深淺拷貝
先來看一下這個問題
從上到下只有一個列表建立
# lst1 = ["胡辣湯","麻辣香鍋","灌湯包","油潑面"]
# lst2 = lst1 #並沒有產生新物件.只是一個指向(記憶體地址)的賦值
# print(id(lst1))#2253612239048
# print(id(lst2))#2253612239048
# lst1.append("葫蘆娃")
# print(lst1)#['胡辣湯', '麻辣香鍋', '灌湯包', '油潑面', '葫蘆娃']
# print(lst2)#['胡辣湯', '麻辣香鍋', '灌湯包', '油潑面', '葫蘆娃']
 
用圖來解釋



# lst1 = ["胡辣湯","麻辣香鍋","灌湯包","油潑面"]
# lst2 = lst1.copy() #拷貝,抄作業,可以幫我們建立新的物件,和原來一模一樣,淺拷貝
# print(id(lst1))#2232732993736
# print(id(lst2))#2232732993672
#
# lst1.append("葫蘆娃")
# print(lst1)
# print(lst2)

用圖來解釋



# lst1 = ["胡辣湯", "灌湯包", "油潑面", "麻辣香鍋", ["長白山", "白洋澱", "黃鶴樓"]]
# lst2 = lst1.copy() #淺拷貝,只拷貝第一層內容
#
# print(id(lst1))#1199044806792
# print(id(lst2))#1199044806984
# print(lst1)
# print(lst2)
#
# lst1[4].append("葫蘆娃")
# print(lst1)
# print(lst2)

用圖來解釋




#深拷貝 需要引入一個模組
import copy

lst1 = ["胡辣湯", "灌湯包", "油潑面", "麻辣香鍋", ["長白山", "白洋澱", "黃鶴樓"]]
lst2 = copy.deepcopy(lst1)#深拷貝 物件內部的所有內容都要複製一份.深度克隆 原型模式
print(id(lst1))#2150506176840
print(id(lst2))#2150506178120

print(lst1)#['胡辣湯', '灌湯包', '油潑面', '麻辣香鍋', ['長白山', '白洋澱', '黃鶴樓']]
print(lst2)#['胡辣湯', '灌湯包', '油潑面', '麻辣香鍋', ['長白山', '白洋澱', '黃鶴樓']]
lst1[4].append("葫蘆娃")
print(lst1)#['胡辣湯', '灌湯包', '油潑面', '麻辣香鍋', ['長白山', '白洋澱', '黃鶴樓', '葫蘆娃']]
print(lst2)#['胡辣湯', '灌湯包', '油潑面', '麻辣香鍋', ['長白山', '白洋澱', '黃鶴樓']]

用圖來解釋


為什麼要有深淺拷貝?
提高建立速度 計算機中最慢的就是建立物件,需要分配記憶體各種事情
最快的方式就是以二進位制流的方式進行復制 速度最快