你真的了解Python嗎 ---Python的內存管理


 

請看下面的一段代碼:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM