Python的内存管理 小理解
2024-10-16 13:07:48
请看下面的一段代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
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) print(origin)#输出结果发生了改变 |
讲一下这段代码的意思:
我们首先给定一个字典origin = {'a':100,'b':[1,2,34,5]}
我们想要得到这个字典对象的一份拷贝,目的是在操作这个对象的时候不会更改该对象的属性。由于Python对象的引用机制,我们知道,当把一个对象赋给一个变量的时候,实际上是建立了一个该变量到对象的引用。如图和代码所示,这是最基本的Python内存管理机制。
因此我们得到上段代码的输出结果:
1
2
3
4
5
6
7
|
{ 'a' : 100, 'b' : [1, 2, 34, 5]} { 'key2' : { 'a' : 100, 'b' : [1, 2, 34, 5]}, 'key1' : { 'a' : 100, 'b' : [1, 2, 34, 5]}} { '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]}} { 'a' : 1000, 'b' : [1, 2, 34, 5]} |
其实这种改变在Javascript中也是一样的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<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的关于内存管理基础知识(虽然里面可能是由于版本问题,有点小错误)
最新文章
- [干货]Chloe官网及基于NFine的后台源码毫无保留开放
- [转]ping检测网络连接异常
- tomcat部署web项目的3中方法
- [转]如何启用Ubuntu的休眠模式
- 改变了Tomcat路径后无法卸载和重装的解决办法
- Android WebView使用基础
- [转]软件开发过程(CMMI/RUP/XP/MSF)是与非?
- vs2008 编译时候 自动关闭 问题解决方法
- C++指针和引用
- EA强大功能之代码凝视
- MyBatis 使用Generator自动生成Model , Dao, mapper
- 欧拉函数之HDU1286找新朋友
- HDU 1013.Digital Roots【模拟或数论】【8月16】
- return的新思考
- python3 字典常见用法总结
- C# .Net List<;T>;中Remove()、RemoveAt()、RemoveRange()、RemoveAll()的区别,List<;T>;删除汇总
- 爬虫系列2:Requests+Xpath 爬取租房网站信息
- 【shiro】(5)---基于Shiro的权限管理
- ORM模板层
- Android Studio - 如何停止logcat不断滚动信息?