a = [1,2,3]app
b = [1,2,3]spa
a == b 對象
==>True內存
a is bclass
==>False 引用
數字在-5到256時如:總結
a = 1copy
b = 1co
a is b ==> True
is判斷兩個引用是否指向同一對象(地址),引用比較
a = [1,2,3],b = [1,2,3]中兩個列表存放的地址不一樣,能夠用id(a),id(b)驗證
==判斷兩個對象的值是否相等數字
淺copy
a = [1,2,3]
b = a
==>id(a) == id(b)
深copy(須要導入copy模塊)
c = copy.deepcopy(a)
==>id(a) != id(c)
此時在另外一地址又存放了一份兒[1,2,3],由c指向這個地址,a還指向原來的[1,2,3]的地址,
當a指向的那塊地址的值改變後如a.append(4),a變c不變。
另外一例淺copy
a = [1,2,3]
b = [4,5,6]
c = [a,b]
d = c
此時a和b分別指向不一樣的內存地址,c開闢另外一內存空間存放a和b這兩個引用,就把c中的a指向原有的a指向的地址,
c中的b指向原有的b指向的地址。
d和c爲淺copy,d指向c的內存地址。
另外一例深copy
e = copy.deepcopy(c)
此時e開闢另外一內存空間存放a和b這兩個引用,就把這兩個引用所指向的內容在另外一地址又存放一份兒,並分別用e中的
a和b指向它們。
再一例copy.deepcopy()
a = [1,2,3]
b = [4,5,6]
c = (a,b) #不可變類型元組
d = copy.deepcopy(c)
a或b變d仍是不變,緣由與列表相同
還一例copy.copy()
a = [1,2,3]
b = [4,5,6]
c = [a,b]
e = copy.copy(c)
此時e另開一內存存放a,b兩個引用,但這兩個引用仍是指向原來的a,b所指向的內存空間
最後一例copy.copy()
a = [1,2,3]
b = [4,5,6]
c = (a,b)#不可變類型
e = copy.copy(c)
此時e並不開闢另外一內存空間,它指向c的地址,a或b變它也變
總結:
深copy,無論被copy的對象是可變類型仍是不可變類型,都是另開闢一塊內存空間,若是存
放的值是引用,
那將引用的內容也一樣另開一塊空間存放,其實就是隻要是deepcopy以後,先後二者已經
沒有任何關係了。
淺copy,若是被copy的對象是可變類型,就開另外一地址存放,若是是不可變類型,它就直接
指向被copy對象的地址。若是存放的值是引用,不開闢另外一內存空間,裏面的引用仍是指向原
來的那個地址,全部原來那個地址的值改變以後,copy過來的值也同時改變。