廣州佛山建設(shè)信息網(wǎng)站個(gè)人微信管理系統(tǒng)
前言
本文主要介紹了python中容易面臨的考試點(diǎn)和犯錯點(diǎn),即淺拷貝與深拷貝
首先,針對Python中的可變對象來說,例如列表,我們可以通過以下方式進(jìn)行淺拷貝和深拷貝操作:
import copya = [1, 2, 3, 4, ['a', 'b']]b = a # 賦值,將變量a賦值給變量b
c = a.copy() # 淺拷貝, 或者 c = copy.copy(a)
d = copy.deepcopy(a) # 深拷貝print(a) # [1, 2, 3, 4, ['a', 'b']]
print(b) # [1, 2, 3, 4, ['a', 'b']]
print(c) # [1, 2, 3, 4, ['a', 'b']]
print(d) # [1, 2, 3, 4, ['a', 'b']]
我們可以發(fā)現(xiàn),賦值、淺拷貝和深拷貝后的變量的值是一樣的,但他們的“內(nèi)部”真的一樣嗎?
本文就是回答這個(gè)問題的
參考
本文主要參考了嗶哩嗶哩視頻:十分鐘!徹底弄懂Python深拷貝與淺拷貝機(jī)制
是視頻里,up主推薦了一個(gè)神奇,即pythontutor
列表(list)
結(jié)論
為了探究前言中提到的a,b,c,d是個(gè)變量是否真的一樣,我們借助pythontutor來進(jìn)行可視化,從內(nèi)存的角度來進(jìn)行探究
結(jié)論:
賦值:變量b和a是完全一樣的,即他們完全共享同一個(gè)內(nèi)存空間,a變,b也會跟著變。
淺拷貝:變量c只有跟a共享第二級的列表,而不共享第一級列表的內(nèi)容,即改變a的第一層列表內(nèi)容,c不會變,而改變a第二層列表的內(nèi)容,c就會跟著變了。
深拷貝:變量d和a完全不共享任何內(nèi)存,d完全是新開辟了一個(gè)新的空間,即可認(rèn)為d和a是完全沒有關(guān)系的,改變a或者d都不會影響對方。
測試
import copya = [1, 2, 3, 4, ['a', 'b']]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)print('a:', a) # [1, 2, 3, 4, ['a', 'b']]
print('b:', b) # [1, 2, 3, 4, ['a', 'b']]
print('c:', c) # [1, 2, 3, 4, ['a', 'b']]
print('d:', d) # [1, 2, 3, 4, ['a', 'b']]a.append(5)
a[4].append('c')print('a:', a) # [1, 2, 3, 4, ['a', 'b', 'c'], 5]
print('b:', b) # [1, 2, 3, 4, ['a', 'b', 'c'], 5]
print('c:', c) # [1, 2, 3, 4, ['a', 'b', 'c']]
print('d:', d) # [1, 2, 3, 4, ['a', 'b']]
結(jié)果:
這里的結(jié)果也不用多解釋了,完全符合前面的結(jié)論
元組(tuple)
由于元組是不可變對象,那它的淺拷貝與深拷貝會一樣嗎?例如:
import copya = (1, 2, 3, 4, ('a', 'b'))
b = a
c = copy.copy(a)
d = copy.deepcopy(a)print('a:', a)
print('b:', b)
print('c:', c)
print('d:', d)
還是直接去看內(nèi)存空間
結(jié)論:
對于元組來說,賦值、淺拷貝與深拷貝沒有區(qū)別,都共享同一個(gè)內(nèi)存,這也很好理解,因?yàn)樵M是不可變對象,是無法對變量a進(jìn)行修改的
列表與元組混合
列表里面嵌套元組
import copya = [1, 2, 3, 4, ('a', 'b')]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)print('a:', a)
print('b:', b)
print('c:', c)
print('d:', d)
內(nèi)存情況:
結(jié)論:
就算是深拷貝,元組部分都是共享內(nèi)存的
元組里面嵌套列表
import copya = (1, 2, 3, 4, ['a', 'b'])
b = a
c = copy.copy(a)
d = copy.deepcopy(a)print('a:', a)
print('b:', b)
print('c:', c)
print('d:', d)
內(nèi)存情況:
結(jié)論:
完全同列表的情況