總結:python
# 淺拷貝:list dict: 嵌套的可變數據類型是同一個 # 深拷貝:list dict: 嵌套的不可變數據類型彼此獨立
# 我的理解: # 在內存中從新建立一個空間(因此內存地址不一樣), # 內存地址延用以前的,因此列表內每一個元素的內存地址相同, # 修改數據:如列表內元素爲不可變類型,修改後,至關於修改了內存地址指向,拷貝的用的是以前的內存地址,因此兩個列表同一位置,數據不一樣 # 如列表內元素爲可變類型,兩個列表id相同,修改後,id依然不變,因此,列表內可變類型元素修改後,兩個同時修改 # 拷貝後,二者id不一樣 list1 = [1, 201, "name", ["zhangsan", "lisi"]] list2 = list1.copy() print(id(list1)) # 1494875032904 print(id(list2)) # 1494875033032 # 拷貝後,直接給列表增長數據 # copy以後,內存地址不同,此時再去修改數據,只是修改的本身自己,不影響copy後的數據 list1.append("333") print(list1) # [1, 201, 'name', ['zhangsan', 'lisi'], '333'] print(list2) # [1, 201, 'name', ['zhangsan', 'lisi']] # copy後,修改列表內不可變數據類型數據,修改後,不影響copy數據 list1[0] = 800 print(id(list1[0])) # 2742476311120 print(id(list2[0])) # 1894219888 print(list1) # [800, 201, 'name', ['zhangsan', 'lisi'], '333'] print(list2) # [1, 201, 'name', ['zhangsan', 'lisi']] # copy後,修改列表內可變數據類型數據,修改後,二者同時改變 list1[-2].append("huhansan") print(id(list1[-2])) # 324363528840 print(list1) # [1, 201, 'name', ['zhangsan', 'lisi', 'huhansan'], '333'] print(id(list2[-1])) # 324363528840 print(list2) # [1, 201, 'name', ['zhangsan', 'lisi', 'huhansan']]
# 深拷貝 copy後,二者彼此徹底獨立 # python優化爲:列表中不可變數據類型使用同一地址,可變數據類型從新建立,彼此獨立 import copy list1 = [1, 201, "name", ["zhangsan", "lisi"]] list2 = copy.deepcopy(list1) print(id(list1)) # 2336950587016 print(id(list2)) # 2336950570440 # 修改深拷貝後,列表內可變數據類型數據,二者id不一樣,彼此獨立 list1[-1].append("wangwu") print(id(list1[-1])) # 1506007387720 print(id(list2[-1])) # 1506007384904 print(list1) # [1, 201, 'name', ['zhangsan', 'lisi', 'wangwu']] print(list2) # [1, 201, 'name', ['zhangsan', 'lisi']] # 面試題: list3 = [1, 2, 3, [22, 33]] list4 = list3[:] list3[-1].append("zhangsan") print(id(list3[-1])) # 1966908952200 print(id(list4[-1])) # 1966908952200 print(list3) # [1, 2, 3, [22, 33, 'zhangsan']] print(list4) # [1, 2, 3, [22, 33, 'zhangsan']]