首先了解一下引用 對象 賦值
a = 1 # 1為一個(gè)對象,a是引用,即引用對象的內(nèi)存地址
注意: python已經(jīng)定義好的小整數(shù)池等,當(dāng)沒有引用指向?qū)ο髸r(shí)僵腺,會被內(nèi)存機(jī)制回收等知識
- 賦值,copy壶栋,deepcopy
from copy import copy,deepcopy
'''
a是引用想邦,[1,2,[3]]是對象
可變類型:可以改變對象的內(nèi)容,引用的內(nèi)存地址不變
不可變類型:不能改變對象的內(nèi)容委刘,只能將其引用指向另一個(gè)內(nèi)存地址
'''
a = [1,2,[3]]
b = a # 引用丧没,即同用一個(gè)id地址鹰椒,隨a變化
a_copy = copy(a)
a_deepcopy = deepcopy(a)
print(b,a_copy,a_deepcopy) # [1, 2, [3], 4] [1, 2, [3]] [1, 2, [3]]
a.append(4)
print(b,a_copy,a_deepcopy) # [1, 2, [3], 4] [1, 2, [3]] [1, 2, [3]]
a[2].append(5)
print(b,a_copy,a_deepcopy) # [1, 2, [3, 5], 4] [1, 2, [3, 5]] [1, 2, [3]]
'''
不可變類型--無論是賦值,還是深淺拷貝呕童,都是指向?qū)υ獢?shù)據(jù)的id地址漆际,當(dāng)元數(shù)據(jù)改變,指向另一個(gè)新id地址夺饲,
可變類型--賦值是對原對象地址的引用奸汇,深淺拷貝都會產(chǎn)生新對象,改變元數(shù)據(jù)往声,不會對深淺拷貝產(chǎn)生影響擂找,但是對于淺拷貝,如果對象中還存在可變類型浩销,即是引用地址贯涎,而不是一個(gè)新的對象。
'''
總結(jié):
1. 深淺拷貝都會產(chǎn)生新對象慢洋,指向新的內(nèi)存地址
2. 賦值塘雳,不可變類型產(chǎn)生新對象,可變類型指向元數(shù)據(jù)的內(nèi)存地址
3. 淺拷貝普筹,只是對最外層產(chǎn)生新對象败明,對其中的可變類型為引用其內(nèi)存地址。改變元數(shù)據(jù)的可變部分太防,還是會產(chǎn)生影響妻顶。
- 深拷貝,即完完全全產(chǎn)生一個(gè)新對象蜒车,改變元數(shù)據(jù)讳嘱,不會對其產(chǎn)生影響。
-
最后附一張圖醇王,便于理解和記憶 copy&deepcopy.jpg