請看下面的一段代碼:
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的關於內存管理基礎知識(雖然里面可能是由於版本問題,有點小錯誤)

