lst1 = ["金毛獅王", "紫衫龍王", "白眉鷹王", "青翼蝠王"] lst2 = lst1 print(lst1) print(lst2) lst1.append("楊逍") print(lst1) print(lst2) # 結果: # ['金毛獅王', '紫衫龍王', '白眉鷹王', '青翼蝠王', '楊逍'] # ['金毛獅王' '紫衫龍王' '白眉鷹王' '青翼蝠王' '楊逍']
dic1 = {"id": 123, "name": "謝遜"} dic2 = dic1 print(dic1) print(dic2) dic1['name'] = "范瑤" print(dic1) print(dic2) # 結果: # {'id': 123, 'name': '謝遜'} # {'id': 123, 'name': '謝遜'} # {'id': 123, 'name': '范瑤'} # {'id': 123, 'name': '范瑤'}
對于list, set, dict來說, 直接賦值. 其實是把內存地址交給變量. 并不是復制一份內容. 所以.
lst1的內存指向和lst2是一樣的. lst1改變了, lst2也發生了改變
?
淺拷貝
lst1 = ["何炅", "杜海濤","周渝民"] lst2 = lst1.copy() lst1.append("李嘉誠") print(lst1) # ['何炅', '杜海濤', '周渝民', '李嘉誠'] print(lst2) # ['何炅', '杜海濤', '周渝民'] print(id(lst1), id(lst2)) # 43601416 43473160
結果:
兩個lst完全不一樣. 內存地址和內容也不一樣. 發現實現了內存的拷貝
lst1 = ["何炅", "杜海濤","周渝民", ["麻花藤", "馬蕓", "周筆暢"]] lst2 = lst1.copy() lst1[3].append("無敵是多么寂寞") print(lst1) print(lst2) print(id(lst1[3]), id(lst2[3])) # 結果: # ['何炅', '杜海濤', '周渝民', ['麻花藤', '馬蕓', '周筆暢', '無敵是多么寂寞']] # ['何炅', '杜海濤', '周渝民', ['麻花藤', '馬蕓', '周筆暢', '無敵是多么寂寞']] # 4417248328 4417248328
淺拷貝. 只會拷貝第一層. 第二層的內容不會拷貝. 所以被稱為淺拷貝
?
深拷貝
import copy lst1 = ["何炅", "杜海濤","周渝民", ["麻花藤", "馬蕓", "周筆暢"]] lst2 = copy.deepcopy(lst1) lst1[3].append("無敵是多么寂寞") print(lst1) print(lst2) print(id(lst1[3]), id(lst2[3])) # 結果: # ['何炅', '杜海濤', '周渝民', ['麻花藤', '馬蕓', '周筆暢', '無敵是多么寂寞']] # ['何炅', '杜海濤', '周渝民', ['麻花藤', '馬蕓', '周筆暢']] # 4447221448 4447233800
可見深拷貝是把元素內部的元素完全進行拷貝復制,不會產生一個改變另一個跟著改變的問題