ETH官方钱包

切換
舊版
前往
大廳
主題

Python筆記Day6-賦值和深/淺拷貝

萬念俱灰的人最強(qiáng) | 2019-07-26 14:11:48 | 巴幣 0 | 人氣 78

在提到這些之前,要先知道在Python的世界中,一切均為物件

And 變數(shù)只是種名稱
當(dāng)給定值時不會將值複製,而是將名稱貼到給定的物件上

範(fàn)例:
a = 20
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))
而當(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的引用是相同的
-------深拷貝--------

深拷貝則是直接連所引用的物件也一起再成立一個物件

我們再拿剛剛的程式碼將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]




在官方文件中有更詳細(xì)的說明
有興趣的可以自己去看看

參考內(nèi)容:

創(chuàng)作回應(yīng)

更多創(chuàng)作