Python is和 及深拷貝和淺拷貝的區別

2021-09-24 02:07:15 字數 3186 閱讀 4899

一.is和==的區別

== 用於判斷引用變數的值是否相等。只判斷值和資料型別

is 用於判斷兩個變數引用物件是否為同乙個,就是所引用的物件的記憶體位址是否一致

>>> a = '1'

>>> b = 1

>>> a == b ##a、b的變數型別不同,則判斷為假

false

>>> a = '1'

>>> b = a ##將a賦值給b,此是b的值及型別與a相同,並且引用的物件為同乙個『1』則返回為true

>>> a is b

true

>>> a

'1'>>> b

'1'>>> li = [1,2,3]

>>> li1 = li ##將li賦值給li1,則li1與li的值及資料型別相同,同時兩列表引用同乙個列表

>>> li1

[1, 2, 3]

>>> id(li)

139695752176392 ##兩列表指定的為同一記憶體位址

>>> id(li1)

139695752176392

>>> li2 = li.copy() ##li2與li型別資料相同但記憶體位址不同

>>> li2

[1, 2, 3]

>>> id(li1)

139695752176392

>>> li == li1

true

>>> li1 == li2

true

>>> li2 is li

false

>>> li2 is li1

false

>>> li1 is li

true

二.淺拷貝與深拷貝

淺拷貝:copy.copy

深拷貝:copy.deepcopy

1.當被複製的物件完全是不可變資料型別的時候,兩者效果相同,都是引用。新生成的變數引用的物件與之前的變數完全一致:

import copy

x = 6

li = (2,5,7,8)

a = (x,li)

b = copy.copy(a)

c = copy.deepcopy(a)

print(a,type(a),id(a),id(a[1]))

print(b,type(b),id(b),id(b[1]))

print(c,type(c),id(c),id(c[1]))

(6, (2, 5, 7, 8)) 140417383556744 140417383646056

(6, (2, 5, 7, 8)) 140417383556744 140417383646056

(6, (2, 5, 7, 8)) 140417383556744 140417383646056

2.當被複製的外層父物件是不可變資料型別,裡面子物件是可變資料型別的時候:

淺拷貝:完全的引用,新生成的變數完全引用了原來變數所引用的父物件以及子物件

深拷貝:生成新的父物件以及子物件,新的變數引用新生成的父物件和子物件

import copy

x = 6

li = [2,5,7,8]

a = (x,li)

b = copy.copy(a)

c = copy.deepcopy(a)

print(a,type(a),id(a),id(a[1]))

print(b,type(b),id(b),id(b[1]))

print(c,type(c),id(c),id(c[1]))

(6, [2, 5, 7, 8]) 140524039169672 140523918012808

(6, [2, 5, 7, 8]) 140524039169672 140523918012808

(6, [2, 5, 7, 8]) 140524039174344 140524038727688

3.當被複製的外層父物件是可變資料型別,裡面子物件是不可變資料型別的時候:

不論是深拷貝還是淺拷貝,都生成新的父物件,引用原來的子物件

import copy

x = 6

li = (2,5,7,8)

a = [x,li]

b = copy.copy(a)

c = copy.deepcopy(a)

print(a,type(a),id(a),id(a[1]))

print(b,type(b),id(b),id(b[1]))

print(c,type(c),id(c),id(c[1]))

[6, (2, 5, 7, 8)] 140695682261384 140695803491176

[6, (2, 5, 7, 8)] 140695802948040 140695803491176

[6, (2, 5, 7, 8)] 140695802947592 140695803491176

當被複製的外層父物件是可變資料型別,裡面子物件是可變資料型別的時候

淺拷貝:生成新的父物件,子物件引用原來的

深拷貝生成新的父物件及子物件,新變數引用新生成的父物件以及子物件

import copy

x = 6

li = [2,5,7,8]

a = [x,li]

b = copy.copy(a)

c = copy.deepcopy(a)

print(a,type(a),id(a),id(a[1]))

print(b,type(b),id(b),id(b[1]))

print(c,type(c),id(c),id(c[1]))

[6, [2, 5, 7, 8]] 140030832810440 140030712095112

[6, [2, 5, 7, 8]] 140030832809992 140030712095112 ##淺拷貝生成新的父物件,子物件引用原來的

[6, [2, 5, 7, 8]] 140030832810568 140030832810632 ##深拷貝生成新的父物件及子物件,新變數引用新生成的父物件以及子物件

python is和 區別 深拷貝和淺拷貝

請簡述賦值,深拷貝和淺拷貝的區別?python中如何拷貝乙個物件?直接賦值 li1 li 只傳遞物件的引用,li1指向物件li的記憶體位址空間,因此,原有列表li改變,被賦值的li1也會做相應的改變.深拷貝 import copy,eg li3 copy.deepcopy li li和li3的記憶體...

深拷貝和淺拷貝

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