對 「 」, 「is」 以及賦值 深淺拷貝的理解

2021-10-01 13:43:26 字數 2949 閱讀 3016

== 與 is 的區別

== :判斷 值,比較兩個物件是否相等

is :判斷 位址,比較兩個引用是否指向了同乙個物件(引用比較)

賦值、深拷貝、淺拷貝的區別

首先,不可變資料型別的記憶體都指向同乙個位址,所以深拷貝和淺拷貝對於不可變資料型別而言都是無意義的。

對於不可變資料型別:

import copy

# 深拷貝

```python

a ='python'

b = copy.deepcopy(a)

print

(a,id

(a))

# python 2796288573600

print

(b,id

(b))

# python 2796288573600

#淺拷貝

```python

c = copy.copy(a)

print

(a,id

(a))

# python 2796288573600

print

(c,id

(c))

# python 2796288573600

賦值

是對原變數的完全複製,記憶體位址一樣,如果原來的改變,後面的也會跟著變。

x =

[123

,456

,789

]y = x

print

(x,id

(x))

# [123, 456, 789] 1885210370632

print

(y,id

(y))

# [123, 456, 789] 1885210370632x[0

]=1print

(x,id

(x))

# [1, 456, 789] 1885210370632

print

(y,id

(y))

# [1, 456, 789] 1885210370632

深拷貝

對於可變資料型別:

import copy

a =[

123,[1

,2,3

]]b = copy.deepcopy(a)

print

(a,id

(a),

id(a[0]

),id(a[1]

))# [123, [1, 2, 3]] 2734749304648 140719688872400 2734749304584

print

(b,id

(b),

id(b[0]

),id(b[1]

))# [123, [1, 2, 3]] 2734749395720 140719688872400 2734749502728a[1

][0]

=5# 修改巢狀列表的元素

print

(a,id

(a),

id(a[0]

),id(a[1]

))# [123, [5, 2, 3]] 2734749304648 140719688872400 2734749304584

print

(b,id

(b),

id(b[0]

),id(b[1]

))# [123, [1, 2, 3]] 2734749395720 140719688872400 2734749502728

我們可以看到,深拷貝是之間建立了乙個新的物件,所以位址不同,將原物件所有的值/元素拷貝過來,而且是對其所有層次的拷貝(包括巢狀列表)

將原物件的「 值/元素 」賦給新物件,新物件中元素的位址與原物件的 位址不同

是對原物件 所有層次 的拷貝(遞迴)

與原物件沒有任何關係,如果原物件發生變化,深拷貝後的新物件 不會發生改變

淺拷貝對於可變資料型別:

import copy

a =[

123,[1

,2,3

]]b = copy.copy(a)

print

(a,id

(a),

id(a[0]

),id(a[1]

))# [123, [1, 2, 3]] 2944705742536 140719688872400 2944705742472

print

(b,id

(b),

id(b[0]

),id(b[1]

))# [123, [1, 2, 3]] 2944705837704 140719688872400 2944705742472a[1

][0]

=5# 修改巢狀列表的元素

print

(a,id

(a),

id(a[0]

),id(a[1]

))# [123, [5, 2, 3]] 2944705742536 140719688872400 2944705742472

print

(b,id

(b),

id(b[0]

),id(b[1]

))# [123, [5, 2, 3]] 2944705837704 140719688872400 2944705742472

我們可以看到,兩個列表的元素指向同一位址,拷貝的只是原列表元素的引用。

當我們修改巢狀列表的元素時,新列表中的巢狀列表也會發生改變,這是因為淺拷貝只拷貝了表面一層列表,而巢狀列表並沒有進行拷貝,所以修改巢狀列表之後,新列表也會變。

將原物件的 引用 賦給新物件,新物件中元素的位址與原物件的 位址相同

是對原物件 頂層 的拷貝(表面一層)

由於只拷貝了表面一層,當原物件中的巢狀物件發生改變時,新物件也 會發生改變

89 賦值過載以及深淺拷貝

示例 1 define crt secure no warnings 2 include 3 using namespace std 45 非指標,則深淺拷貝都一樣,含有指標則記憶體共享,指標一致,內容一直6 深拷貝,指標不一致,記憶體一直,記憶體是獨享的7 賦值過載如果有返回自身型別物件,會呼叫拷...

深淺拷貝以及深淺拷貝的方法

先考慮一種情況,對乙個已知物件進行拷貝,編譯系統會自動呼叫一種建構函式 拷貝建構函式,如果使用者未定義拷貝建構函式,則會呼叫預設拷貝建構函式。執行結果 呼叫一次建構函式,呼叫兩次析構函式,兩個物件的指標成員所指記憶體相同,name指標被分配一次記憶體,但是程式結束時該記憶體卻被釋放了兩次,會造成記憶...

賦值與深淺拷貝

a 1 b a a 2 print a a print b b 列印出結果 a 2 b 1 解析 當a 1的時候,記憶體中開闢兩個空間,乙個空間存放數字1,乙個空間存放數字1的實體地址0x52446c40,當b a的時候,是將a的值賦予b,記憶體中會開闢另乙個空間也是存放數字1的實體地址0x5244...