python中的淺拷貝和深拷貝

2021-09-08 13:25:24 字數 2614 閱讀 6355

本篇介紹下python中的深拷貝和淺拷貝,主要從基本型別、類、不可變型別等方面進行介紹

1.介紹拷貝之前首先應該明白is和==的區別,即is表示同乙個物件,==比較的是值

>>> a = 1000

>>> b = 1000

>>> a ==b

true

>>> a is

bfalse

class

person(object):

def__init__

(self, name):

self.name =name

p1 = person("

lingling")

p2 = person("

lingling")

print(p1 is p2) #

false

print(p1 == p2) #

false

總結:因為p1和p2不是同乙個物件,所以返回false,==是比較的值,因為這是自定義的類,python直譯器並不知道比較的規則,所以使用預設的比較規則,即呼叫這個物件所屬類中的魔法方法__eq__(),因為person類並沒有重寫這個方法,所以預設呼叫object中的__eq__()方法,object中的__eq__()方法,預設使用了is的比較值。

def

__eq__(self, *args, **kwargs): #

real signature unknown

"""return self==value.

"""pass

重寫__eq__之後

class

person(object):

def__init__

(self, name):

self.name =name

def__eq__

(self, other):

return self.name ==other.name

p1 = person("

lingling")

p2 = person("

lingling")

print(p1 is p2) #

false

print(p1 == p2) #

true

2.基本型別

#

淺拷貝in [1]: import

copy

in [2]: a=[10,20]

in [3]: b=[30,40]

in [4]: c=[a,b]

in [5]: d=copy.copy(c)

in [6]: c is

dout[6]: false

in [7]: c

out[7]: [[10, 20], [30, 40]]

in [8]: d

out[8]: [[10, 20], [30, 40]]

in [10]: c

out[10]: [[10, 20, 50], [30, 40]]

in [11]: d

out[11]: [[10, 20, 50], [30, 40]]

in [12]: c is

dout[12]: false

#深拷貝

in [13]: a=[10,20]

in [14]: b=[10,20]

in [15]: c=[a,b]

in [16]: d=copy.deepcopy(c)

in [17]: c is

dout[17]: false

in [19]: c

out[19]: [[10, 20, 50], [10, 20]]

in [20]: d

out[20]: [[10, 20], [10, 20]]

in [21]: c is

dout[21]: false

總結:淺拷貝即只複製第一層資料,更深層的引用不管,深拷貝,是最深層值的拷貝。

3.不可變型別

in [22]: a=(1,2)

in [23]: b=copy.copy(a)

in [24]: a is

bout[24]: true

in [25]: b=copy.deepcopy(a)

in [26]: a is

bout[26]: true

in [27]: a=[10,20]

in [28]: b=[30,40]

in [29]: c=(a,b)

in [30]: d=copy.copy(c)

in [31]: c is

dout[31]: true

in [32]: d=copy.deepcopy(c)

in [33]: c is

dout[33]: false

總結:對於元組這種不可變型別,是不能修改的,所以python為了省儲存空間,對於不可變型別,記憶體中始終維護著乙份資料。

python中的淺拷貝和深拷貝

不得不說 python核心程式設計 是一本好書,看到其中一節做一下隨筆。在python中,當建立乙個物件後,然後把它賦給另乙個物件時,python並沒有去拷貝這個物件,而是拷貝了這個物件的引用。看不懂沒關係,我們看乙個例子。raw list first second 12 32 copy list ...

python中的深拷貝和淺拷貝

淺拷貝 copy 不拷貝物件的內容,僅僅拷貝子物件的引用 深拷貝 deepcopy 會連同拷貝子物件的記憶體,對子物件的修改不會影響源物件 下面用 來測試 import copy deftest copy 淺拷貝測試 a 10 20,5,6 b copy.copy a print a a,end t...

Python中的深拷貝和淺拷貝

一 賦值 1 在python中,物件的賦值就是簡單的引用,a 1,2,3 b a,在上述情況下,a和b是一樣的,他們指向同一片記憶體,b不過是a的別名,是引用,我們可以使用b is a去判斷,返回true,表名他們位址相同內容也相同,也可以使用id 函式來檢視.看兩個列表位址是否相同。2 賦值操作 ...