在提到這些之前,要先知道在Python的世界中,一切均為物件!
And 變數(shù)只是種名稱
當(dāng)給定值時不會將值複製,而是將名稱貼到給定的物件上
範(fàn)例:
a = 20
b = a
print(id(20))
print(id(a))
print(id(b))實際上只是20同時擁有a和b兩種稱呼
b = a
print(id(20))
print(id(a))
print(id(b))實際上只是20同時擁有a和b兩種稱呼
這三者輸出的都是140720871749040
a = 40
print(id(20))
print(id(40))
print(id(a))
print(id(b))
print(id(20))
print(id(40))
print(id(a))
print(id(b))
而當(dāng)我們將a的值改變後得到的輸出為
140720871749040# id(20)
140720871749680# id(40)
140720871749680# id(a)
140720871749040# id(b)
# 我們可以看到20這個位置就是140720871749040
# 40的位置為140720871749680
在這裡改變a值,實際上是把a(bǔ)改成指向40,而b仍然是指20,不受其影響。
當(dāng)給定值時不會將值複製,而是將名稱貼到給定的物件上。
-------深淺拷貝--------
copy.copy()
copy.deepcopy()
昨天我們提到這兩個為的是要避免List中,改變了a,連b一起也被改變。
兩者的區(qū)別在於要複製的物件之中,有沒有所謂的可變型別。
什麼是可變型別?什麼又是不可變型別?
我們之前講到的字串和tuple這兩個就算是不可變型別
而List和還沒介紹的Dictionary則屬於可變型別
-------淺拷貝--------
import copy
b = [1,2]
a = [b, 3, 4]
# 創(chuàng)建了 [1,2] 物件 ,並且取名b
# 創(chuàng)建了 [b,3,4] 物件 ,並且取名為a [[1,2],3,4]
# 其中的 [b,3,4] 裡頭的b,仍為[1,2]
d = copy.copy(a)
# 創(chuàng)建了一個新的物件,並且複製原有物件的引用
print(d) # [[1, 2], 3, 4]
print(id(a)) # 2596019424200
print(id(b)) # 2596019429448
print(id(a[0])) # 2596019429448
print(id(d[0])) # 2596019429448
# 由於b , a[0] ,d[0] 三者所表示的位置都是同一個[1,2],所以其id()都相同
d[0][0] = 5
# 將d[0][0]指到5 ,意思即是b[0] = 5的意思
print(a) # [[5, 2], 3, 4]
print(b) # [5,2]
a.append(66)
print(a) # [[5, 2], 3, 4, 66]
print(d) # [[5, 2], 3, 4]# 對a物件進(jìn)行改變,不會影響到d物件的值,因為兩者為不同物件,但對b的引用是相同的
b = [1,2]
a = [b, 3, 4]
# 創(chuàng)建了 [1,2] 物件 ,並且取名b
# 創(chuàng)建了 [b,3,4] 物件 ,並且取名為a [[1,2],3,4]
# 其中的 [b,3,4] 裡頭的b,仍為[1,2]
d = copy.copy(a)
# 創(chuàng)建了一個新的物件,並且複製原有物件的引用
print(d) # [[1, 2], 3, 4]
print(id(a)) # 2596019424200
print(id(b)) # 2596019429448
print(id(a[0])) # 2596019429448
print(id(d[0])) # 2596019429448
# 由於b , a[0] ,d[0] 三者所表示的位置都是同一個[1,2],所以其id()都相同
d[0][0] = 5
# 將d[0][0]指到5 ,意思即是b[0] = 5的意思
print(a) # [[5, 2], 3, 4]
print(b) # [5,2]
a.append(66)
print(a) # [[5, 2], 3, 4, 66]
print(d) # [[5, 2], 3, 4]# 對a物件進(jìn)行改變,不會影響到d物件的值,因為兩者為不同物件,但對b的引用是相同的
-------深拷貝--------
深拷貝則是直接連所引用的物件也一起再成立一個物件
我們再拿剛剛的程式碼將copy()改成deepcopy()
d = copy.deepcopy(a)
# 創(chuàng)建了一個新的物件,並且連原有物件的引用一併創(chuàng)成新物件
print(d) # [[1, 2], 3, 4]
print(id(a)) # 2697524071560
print(id(b)) # 2697524076744
print(id(a[0])) # 2697524076744
# b 和 a[0] 所指的仍是一樣的 [1,2]
print(id(d[0])) # 2697524129480
# 但是呢,d部分的[1,2]就不同了,變成新的物件了
d[0][0] = 5
print(a) # [[1, 2], 3, 4]
print(b) # [1, 2]
print(d) # [[5, 2], 3, 4]
# 創(chuàng)建了一個新的物件,並且連原有物件的引用一併創(chuàng)成新物件
print(d) # [[1, 2], 3, 4]
print(id(a)) # 2697524071560
print(id(b)) # 2697524076744
print(id(a[0])) # 2697524076744
# b 和 a[0] 所指的仍是一樣的 [1,2]
print(id(d[0])) # 2697524129480
# 但是呢,d部分的[1,2]就不同了,變成新的物件了
d[0][0] = 5
print(a) # [[1, 2], 3, 4]
print(b) # [1, 2]
print(d) # [[5, 2], 3, 4]
在官方文件中有更詳細(xì)的說明
有興趣的可以自己去看看
參考內(nèi)容: