深拷貝和淺拷貝

2022-09-09 18:33:14 字數 1615 閱讀 6783

在運算元組的時候,它們的資料有時候拷貝進乙個新的陣列,有時候又不是。這經常是初學者感到困惑。下面有三種情況:

如果只是簡單的賦值,那麼不會進行拷貝。示例**如下:

a = np.arange(12)

b = a #這種情況不會進行拷貝

print(b is a) #返回true,說明b和a是相同的

有些情況,會進行變數的拷貝,但是他們所指向的記憶體空間都是一樣的,那麼這種情況叫做淺拷貝,或者叫做view(檢視)。比如以下**:

a = np.arange(12)

c = a.view()

print(c is a) #返回false,說明c和a是兩個不同的變數

c[0] = 100

print(a[0]) #列印100,說明對c上的改變,會影響a上面的值,說明他們指向的記憶體空間還是一樣的,這種叫做淺拷貝,或者說是view

# c 和 a在不同的棧區。如果通過c去修改堆區的值,因為a 和 c是指向一樣的堆區,所以a的值也會發生改變

將之前資料完完整整的拷貝乙份放到另外一塊記憶體空間中,這樣就是兩個完全不同的值了。示例**如下:

a = np.arange(12)

d = a.copy()

print(d is a) #返回false,說明d和a是兩個不同的變數

d[0] = 100

print(a[0]) #列印0,說明d和a指向的記憶體空間完全不同了。

像之前講到的flattenr**el就是這種情況,r**el返回的就是view,而flatten返回的就是深拷貝。

a1 = np.random.rand(2,4)

a1out

array([[0.20647272, 0.17443683, 0.81513683, 0.81169226],

[0.4805403 , 0.66732839, 0.34413928, 0.34445177]])

a2 = a1.r**el()

a2[0] = 0

a1 #修改了a1的值,說明r**el返回的是乙個淺拷貝

outarray([[0. , 0.17443683, 0.81513683, 0.81169226],

[0.4805403 , 0.66732839, 0.34413928, 0.34445177]])

a3 = a1.flatten()

a3[1] = 100

a3out

array([ 0. , 100. , 0.81513683, 0.81169226,

0.4805403 , 0.66732839, 0.34413928, 0.34445177])

在陣列操作中分成三種拷貝:

1、不拷貝:直接賦值,那麼棧區沒有拷貝,只是用同乙個棧區定義了不同的名稱。

2、淺拷貝:只拷貝棧區,棧區指定的堆區並沒有拷貝。

3、深拷貝:棧區和堆區都拷貝了。

深拷貝和淺拷貝

淺拷貝就是物件的資料成員之間的簡單賦值,如你設計了乙個沒有類而沒有提供它的複製建構函式,當用該類的乙個物件去給令乙個物件賦值時所執行的過程就是淺拷貝,如 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...