在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 當兩個物件共享同乙份資料時,如果資料不改變,則進行淺拷貝。當某個物件改變資料時,則進行深拷貝。深拷貝和淺拷貝是程式在處理共享物件時的兩種複製方式。深拷貝是生成乙個物件的完整複製品,而淺拷貝只進行引用複製,如複製指向共享資料的指標。由於深拷貝複製乙個完...