本篇介紹下python中的深拷貝和淺拷貝,主要從基本型別、類、不可變型別等方面進行介紹。
1.介紹拷貝之前首先應該明白is和==的區別,即is表示同乙個物件,==比較的是值
>>> a = 1000>>> b = 1000
>>> a ==b
true
>>> a is
bfalse
classperson(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__之後
classperson(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 賦值操作 ...