python淺拷貝和深拷貝和直接賦值

import copy

a = [1,2,3,4]
id(a)
# 4386320704

b = copy.copy(a)  # 淺拷貝
id(b)
# 4384379840

c = a  # 賦值
id(c)
# 4386320704

d = copy.deepcopy(a)  # 深拷貝
id(d)
# 4425048864

"""
以上可以看出,只有直接賦值的內存地址和原數據的相同,說明他們指向同一地址,
而淺拷貝和深拷貝都是新的地址
"""

a.append([5,6,7])
# a = [1, 2, 3, 4, [5, 6, 7]]
# b = [1, 2, 3, 4]
# c = [1, 2, 3, 4, [5, 6, 7]]
# d = [1, 2, 3, 4]

a.append(8)
# a = [1, 2, 3, 4, [5, 6, 7], 8]
# b = [1, 2, 3, 4]
# c = [1, 2, 3, 4, [5, 6, 7], 8]
# d = [1, 2, 3, 4] 

"""
這時候改變原數據,只有直接賦值的c和a一起變化,其它的不變,爲什麼呢?
因爲最開始拷貝的時候,原數據a中沒有引用數據,都是不可變的基礎數據
"""

# 現在我們重新拷貝一次
b = copy.copy(a)
# b = [1, 2, 3, 4, [5, 6, 7], 8]

d = copy.deepcopy(a)
# d = [1, 2, 3, 4, [5, 6, 7], 8]

a.append(9)
# a = [1, 2, 3, 4, [5, 6, 7], 8, 9]
# b = [1, 2, 3, 4, [5, 6, 7], 8]
# c = [1, 2, 3, 4, [5, 6, 7], 8, 9]
# d = [1, 2, 3, 4, [5, 6, 7], 8]

a[3]=44
# a = [1, 2, 3, 44, [5, 6, 7], 8, 9]
# b = [1, 2, 3, 4, [5, 6, 7], 8]
# c = [1, 2, 3, 44, [5, 6, 7], 8, 9]
# d = [1, 2, 3, 4, [5, 6, 7], 8]

"""
深拷貝:原數據不管怎麼變,它都不會變
淺拷貝:在修改原數據的不可變變量時淺拷貝是不會變化的
直接賦值:不管原數據怎麼變,它都跟着變
"""

# 現在我們變化一下a中的可變變量
a[4][0]=55
# a = [1, 2, 3, 44, [55, 6, 7], 8, 9]
# b = [1, 2, 3, 4, [55, 6, 7], 8]
# c = [1, 2, 3, 44, [55, 6, 7], 8, 9]
# d = [1, 2, 3, 4, [5, 6, 7], 8]

"""
淺拷貝:原數據不可變變量增加修改刪除,它都不會跟着變;原數據可變變量的變化它回跟着變化
"""

"""
總結:
深拷貝:不管原數據怎麼變,它都不會變(深度拷貝,連引用部分的數據也都直接拷貝過來)
直接賦值: 不管原數據怎麼變,它都跟着變(和原數據共用一塊內存地址,實際是原數據的一個引用)
淺拷貝:原數據裏不可變的數據怎麼變,它都不會變;原數據裏可變部分怎麼變,它都跟着變
(原數據不可變的部分直接拷貝,原數據引用部分仍然拷貝引用,而不是實際數據)
"""


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章