python基礎-深淺拷貝

深拷貝與淺拷貝

總結: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']]
相關文章
相關標籤/搜索