因為不可變物件只有在修改時才會開闢新空間,所以拷貝也相當於讓多個引用同時引用了乙個資料,所以不可變物件的淺拷貝和賦值沒有區別
import copy
a = '1'
b = copy.copy(a)
print(id(a), id(b))
對不可變物件進行賦值時,物件引用並沒有發生變化,那不可變物件拷貝時會不會相同呢?
import copy
# 建立乙個可變物件
l1 = [1, 2, 3]
# 拷貝 l1 物件,生成副本 l2
l2 = copy.copy(l1)
# l1 和 l2 的值完全相同
print(l1, l2)
# 但是 l1 和 l2 的引用不同,說明拷貝成功
print(id(l1), id(l2))
# 華麗的分割線
print('*'*20)
# 修改 l1 中的資料
l1[0] = 11
# l1 修改後, l2確實沒有隨著發生變化
print(l1, l2)
print(id(l1), id(l2))
在python中,有多種方式可以實現淺拷貝 1. copy 模組的 copy 方法
import copy
a = [1, 2]
l1 = [3, 4, a]
l2 = copy.copy(l1)
print(l1, l2)
print(id(l1), id(l2))
print('*'*20)
a[0] = 11
print(l1, l2)
print(id(l1), id(l2))
2. 物件本身的 copy 方法
a = [1, 2]
l1 = [3, 4, a]
l2 = l1.copy()
print(l1, l2)
print(id(l1), id(l2))
print('*'*20)
a[0] = 11
print(l1, l2)
print(id(l1), id(l2))
********************
[3, 4, [11, 2]] [3, 4, [11, 2]]
4364204936 4364205192
3. 工廠方法
a = [1, 2]
l1 = [3, 4, a]
l2 = list(l1)
print(l1, l2)
print(id(l1), id(l2))
print('*'*20)
a[0] = 11
print(l1, l2)
print(id(l1), id(l2))
4. 切片
a = [1, 2]
l1 = [3, 4, a]
l2 = l1[1:]
print(l1, l2)
print(id(l1), id(l2))
print('*'*20)
a[0] = 11
print(l1, l2)
print(id(l1), id(l2))
import copy
# 建立乙個可變物件a
a = [1, 2]
# 建立乙個可變物件 l1 中包含可變物件 a
l1 = [3, 4, a]
# 拷貝 l1 物件,生成副本 l2
l2 = copy.deepcopy(l1)
# l1 和 l2 的值完全相同
print(l1, l2)
# l1 和 l2 的引用不同,說明拷貝成功
print(id(l1), id(l2))
# 華麗的分割線
print('*'*20)
# 修改 a 中的資料
a[0] = 11
# a中的資料修改後, 因為l2 逐層的拷貝了所有的引用,所以l2不會發生變化
print(l1, l2)
print(id(l1), id(l2))
# 以上列印位址結果,請自行動手測試。
前端的深拷貝和淺拷貝 深拷貝與淺拷貝的區別
淺拷貝的方式 淺拷貝1 var obj var newobj obj newobj.name 李四 console.log obj console.log newobj 淺拷貝2 object.assgin 引數1 目標物件 引數2 任意多個物件 如果物件是多層的話 var obj var obj1...
淺拷貝與深拷貝的區別
簡單的來說就是,在有指標的情況下,淺拷貝只是增加了乙個指標指向已經存在的記憶體,而深拷貝就是增加乙個指標並且申請乙個新的記憶體,使這個增加的指標指向這個新的記憶體,採用深拷貝的情況下,釋放記憶體的時候就不會出現在淺拷貝時重複釋放同一記憶體的錯誤!我列舉乙個例子來說吧 你正在編寫c 程式中有時用到,操...
深拷貝和淺拷貝的區別
retain屬性表示兩個物件位址相同 建立乙個指標,指標拷貝 內容當然相同,這個物件的retain值 1也就是說,retain 是指標拷貝 淺拷貝 copy 是內容拷貝 深拷貝 ios中並不是所有的物件都支援copy,mutablecopy,遵守nscopying 協議的類可以傳送copy訊息,遵守...