你真的了解Python吗 ---Python的内存管理

本文详细解析了一段Python代码,展示了如何通过字典拷贝避免修改原始对象属性,以及Python对象引用机制的基本原理。通过实例比较了Python与JavaScript在处理对象拷贝时的异同,强调了内存管理的基础知识。

 

请看下面的一段代码:

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的关于内存管理基础知识(虽然里面可能是由于版本问题,有点小错误)

转载于:https://www.cnblogs.com/CBDoctor/p/3798214.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值