請看下面的一段代碼:
origin = {'a':100,'b':[1,2,34,5]} obj_copy ={}; print origin; obj_copy['key1']= origin; obj_copy['key2']= origin; print(obj_copy) print('我們試圖改變obj_copy中某個Key值的內容') obj_copy['key1']['a'] = 10000 print(obj_copy) obj_copy['key1']['b'] = "hello" print(obj_copy) print('----------------------') obj_copy['key1']={'a':100,'b':[1,3,4,56,3]} print(obj_copy) #輸出結果發生了改變
講一下這段代碼的意思:
我們首先給定一個字典origin = {'a':100,'b':[1,2,34,5]}
我們想要得到這個字典對象的一份拷貝,目的是在操作這個對象的時候不會更改該對象的屬性。由於Python對象的引用機制,我們知道,當把一個對象賦給一個變量的時候,實際上是建立了一個該變量到對象的引用。如圖和代碼所示,這是最基本的Python內存管理機制。
圖片來自於網絡。
因此我們得到上段代碼的輸出結果:
{'a': 100, 'b': [1, 2, 34, 5]} {'key2': {'a': 100, 'b': [1, 2, 34, 5]}, 'key1': {'a': 100, 'b': [1, 2, 34, 5]}} 我們試圖改變obj_copy中某個Key值的內容 {'key2': {'a': 10000, 'b': [1, 2, 34, 5]}, 'key1': {'a': 10000, 'b': [1, 2, 34, 5]}} {'key2': {'a': 10000, 'b': 'hello'}, 'key1': {'a': 10000, 'b': 'hello'}} ---------------------- {'key2': {'a': 10000, 'b': 'hello'}, 'key1': {'a': 100, 'b': [1, 3, 4, 56, 3]}}
其實這種改變在Javascript中也是一樣的
<html> <script> obj = {}; obj.a = [21,2,3,4,5,67,8] obj.b = {'key1':10,'key2':20,'key3':"hello,world"} globalValue={}; globalValue.value1 = obj; globalValue.value2 = obj; globalValue.value1=[1,2,34,5,78] alert('test') </script> <body> </body> </html
我們同樣可以通過這種方法實現。
在讀這篇文章之前,可以先閱讀一下Vamei的關於內存管理基礎知識(雖然里面可能是由於版本問題,有點小錯誤)