import copy
names = ['Amir', 'Barry', 'Cgakes', 'Dao', [11, 22, 33]]
# 直接賦值,指向同一個內存地址
names1 = names
# 淺拷貝:重新分配一塊內存,創建一個新的對象,里面的元素是指原對象中子對象的引用
names2 = list(names)# 數據類型本身的構造器
names3 = names1[:] # 切片
names4 = copy.copy(names)
# 深拷貝:遞歸地拷貝原對象中的每一個子對象
names5 = copy.deepcopy(names)
names1[0] = 'haha'
names1[-1][0] = 44
print(names1)
print(names2)
print(names3)
print(names4)
print(names5)
# 輸出
"""
['haha', 'Barry', 'Cgakes', 'Dao', [44, 22, 33]]#父對象和子對象都指向同一個內存地址
['Amir', 'Barry', 'Cgakes', 'Dao', [44, 22, 33]]#父對象獨立,子對象都指向同一個內存地址
['Amir', 'Barry', 'Cgakes', 'Dao', [44, 22, 33]]#父對象獨立,子對象都指向同一個內存地址
['Amir', 'Barry', 'Cgakes', 'Dao', [44, 22, 33]]#父對象獨立,子對象都指向同一個內存地址
['Amir', 'Barry', 'Cgakes', 'Dao', [11, 22, 33]]#父對象和子對象都是獨立的
"""
總結:
賦值就是系統先給一個對象分配了內存地址,然后再將內存地址指向另一個對象,如a=b
淺拷貝是父對象獨立,但是子對象指向同一個內存地址
通常用數據類型本身的構造器如list(),set()
python提供的函數copy.copy()可以適用於任何數據類型
對於可變序列,可以通過切片操作符':'來完成淺拷貝
深拷貝是和原來的父子對象完全獨立,父對象和子對象都指向完全不同的內存地址,copy.deepcopy()
相同值的可變類型的內存地址是不一樣的,但是修改時不需要開辟一塊新的空間,只需修改原內存地址就行了
相同值的不可變類型的內存地址是一樣的