python中隱式的記憶體共享

2021-07-11 02:40:58 字數 2143 閱讀 7712

在python中,基本上使用的是引用,那麼就會造成乙個隱式的記憶體共享,特別是在容器物件中,例如list,dictionary

對於不可變物件,是不會造成隱式的記憶體共享情況,如下所示:

>>> alist = [0]*5

>>> print alist

[0, 0, 0, 0, 0]

>>> alist[0]= 'kel'

>>> alist

['kel', 0, 0, 0, 0]

以上為不可變物件數字型別,數字是不可變物件,在每次都會新建這一物件。

>>> alist = ['kel']*5

>>> alist

['kel', 'kel', 'kel', 'kel', 'kel']

>>> alist[0]='changed'

>>> alist

['changed', 'kel', 'kel', 'kel', 'kel']

字串也是不可變型別,從而在修改乙個物件的時候,其他的物件都會重新建立

在多維陣列列表中,則會造成隱式的記憶體共享,也就是修改其中乙個的值其他的值也會發生改變,如下所示:

>>> multi = [[0]*5]*3

>>> multi

[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

>>> multi[0][0]='kel'

>>> multi

[['kel', 0, 0, 0, 0], ['kel', 0, 0, 0, 0], ['kel', 0, 0, 0, 0]]

當使用列表解析的時候,會造成隱式記憶體共享,在每次使用的時候,都是指向同乙個物件,具體的如下所示:

>>> row = [0]*5  

>>> multi = [row]*3

>>> multi

[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

>>> multi[0][0]='kel'

>>> multi

[['kel', 0, 0, 0, 0], ['kel', 0, 0, 0, 0], ['kel', 0, 0, 0, 0]]

1、 row中的五個子項都引用0 -——在這個時候修改其中之一的值,不會影響其他的值,因為是不可變物件

2、multi中的3個子項都引用row——從而在修改最裡面的值的時候,都會影響其他的值,因為指向的是同乙個物件row

如果物件是不可變的,則物件和物件引用實際上沒什麼區別。

要解決記憶體共享的問題,那麼可以使用雙層迴圈的列表解析,而不是使用直接使用重複的列表解析:

>>> mmultilist = [[0 for x in range(3)] for x in range(5)]

>>> mmultilist

[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]

>>> mmultilist[0][0]='kel'

>>> mmultilist

[['kel', 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]

在進行修改的時候,沒有影響到其他的值,從而這種方法是可以的。

另外,在使用這種雙層迴圈的方式中,可以對開始的進行簡化,從而**如下:

>>> multilist=[[0]*3 for x in range(5)]

>>> multilist

[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]

>>> multilist[0][0] = 'kel'

>>> multilist

[['kel', 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]

當直接使用列表乘以整數的時候,可以直接得到列表的重複,注意在這裡如果是不可變物件,那麼可以使用;如果涉及到了幾維資料的話,那麼就必須使用其中的迴圈從而消除對記憶體共享的影響。

此種問題對於可變物件才會發生,而對於不可變物件是不會發生的。

python中隱式的記憶體共享

在python中,基本上使用的是引用,那麼就會造成乙個隱式的記憶體共享,特別是在容器物件中,例如list,dictionary 對於不可變物件,是不會造成隱式的記憶體共享情況,如下所示 alist 0 5 print alist 0,0,0,0,0 alist 0 kel alist kel 0,0...

Qt 資料的隱式共享

在qt中有很多隱式共享類 implicitly shared classes 什麼是隱式共享呢,請參考官方文件的說明。好吧,翻譯一下 許多c 類隱式地共享資料,使得資源使用最大化,以及物件拷貝最小化。隱式共享類在傳參時既安全又高效,因為只傳了乙個指向資料的指標,並且只有給它寫入時資料才會被拷貝。看了...

Qt學習05 隱式共享

隱式共享又稱回寫複製 copy on write 當兩個物件共享同乙份資料時,如果資料不改變,則進行淺拷貝。當某個物件改變資料時,則進行深拷貝。深拷貝和淺拷貝是程式在處理共享物件時的兩種複製方式。深拷貝是生成乙個物件的完整複製品,而淺拷貝只進行引用複製,如複製指向共享資料的指標。由於深拷貝複製乙個完...