== 與 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...