深拷貝和淺拷貝

2022-08-14 19:06:12 字數 1788 閱讀 7985

import

copy

#淺拷貝

print("

淺拷貝:")

a = [1, 2, 3]

b =a

print(a, "

-" * 5, b)

print(id(a), "

=" * 5, id(b))

print("

結論:a、b指向同一記憶體空間,並沒有新開闢空間")

#深拷貝

print("

*" * 60)

print("

深拷貝:")

a = [1, 2, 3]

b =copy.deepcopy(a)

print(a, "

-" * 5, b)

print(id(a), "

=" * 5, id(b))

print("

結論:b新建的一記憶體空間,裡面的值即為a指向的記憶體空間的值")

#進一步理解拷貝

print("

*" * 60)

print("

進一步理解拷貝:")

print("

淺拷貝:")

a = [1, 2, 3]

b = [4, 5, 6]

c =[a, b]

d =c

print(c, "

-" * 5, d)

print(id(c), "

=" * 5, id(d))

print("

結論:這樣的拷貝即淺拷貝,d、c指向同一記憶體空間")

print("

*" * 30)

print("

深拷貝:")

d =copy.deepcopy(c)

print(c, "

-" * 5, d)

print(id(c), "

=" * 5, id(d))

print("

結論:d新建的乙個記憶體空間,記憶體空間裡面呢,又指向了兩個新的列表,這兩個新的列表裡面放的是a、b的值(都是全新的)")

print("

*" * 30)

print("

補充:(這個牛逼了,半深半淺的拷貝)")

d =copy.copy(c)

print(c, "

-" * 5, d)

print(id(c), "

=" * 5, id(d))

print("

結論:d新建了乙個記憶體空間,記憶體空間裡面有兩個指標,它呢,""

它指向的還是原來的a、b,不是新的a、b(copy.copy()僅僅只對c做了一層判斷,元組淺拷貝,列表深拷貝)")

#拷貝的其他形式

#淺拷貝對不可變型別和可變型別的copy不同

print("

*" * 60)

print("

可變型別:")

a = [1,2,3]

b =copy.copy(a)

print(a, "

-" * 5, b)

print(id(a), "

=" * 5, id(b))

print

()print("

不可變型別(元組):")

a = (1,2,3)

b =copy.copy(a)

print(id(a), "

=" * 5, id(b))

print("

結論:可變型別的copy新建的乙個記憶體空間,不可變型別的copy還是指向原來的記憶體空間

")

深拷貝和淺拷貝

淺拷貝就是物件的資料成員之間的簡單賦值,如你設計了乙個沒有類而沒有提供它的複製建構函式,當用該類的乙個物件去給令乙個物件賦值時所執行的過程就是淺拷貝,如 class a a private int data int main 這一句b a 就是淺拷貝,執行完這句後b.data 5 如果物件中沒有其他...

淺拷貝和深拷貝

以下情況都會呼叫拷貝建構函式 乙個物件以值傳遞的方式傳入函式體 例如 已知class a,class b void func a a void func a a func b b 此時函式對b的操作是呼叫拷貝建構函式後的臨時拷貝物件。多數傳指標 乙個物件以值傳遞的方式從函式返回 如 return b...

深拷貝和淺拷貝

ios提供了copy和mutablecopy方法,顧名思義,copy就是複製了乙個imutable的物件,而mutablecopy就是複製了乙個mutable的物件。以下將舉幾個例子來說明。1 系統的非容器類物件 這裡指的是nsstring nsnumber等等一類的物件。nsstring stri...