请看下面的一段代码:

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

最新文章

  1. [干货]Chloe官网及基于NFine的后台源码毫无保留开放
  2. [转]ping检测网络连接异常
  3. tomcat部署web项目的3中方法
  4. [转]如何启用Ubuntu的休眠模式
  5. 改变了Tomcat路径后无法卸载和重装的解决办法
  6. Android WebView使用基础
  7. [转]软件开发过程(CMMI/RUP/XP/MSF)是与非?
  8. vs2008 编译时候 自动关闭 问题解决方法
  9. C++指针和引用
  10. EA强大功能之代码凝视
  11. MyBatis 使用Generator自动生成Model , Dao, mapper
  12. 欧拉函数之HDU1286找新朋友
  13. HDU 1013.Digital Roots【模拟或数论】【8月16】
  14. return的新思考
  15. python3 字典常见用法总结
  16. C# .Net List&lt;T&gt;中Remove()、RemoveAt()、RemoveRange()、RemoveAll()的区别,List&lt;T&gt;删除汇总
  17. 爬虫系列2:Requests+Xpath 爬取租房网站信息
  18. 【shiro】(5)---基于Shiro的权限管理
  19. ORM模板层
  20. Android Studio - 如何停止logcat不断滚动信息?

热门文章

  1. oracle 11g完美卸载
  2. 〖Linux〗gvim使用alt+1,2,3..进行标签页切换
  3. webservice系统学习笔记2-使用jdk的命令生成本地代码
  4. HTTP协议是如何通信的
  5. WiFi共享精灵与路由器
  6. IDEA编辑区光标样式修改
  7. springmvc访问静态资源的springmvc.xml配置
  8. 测试化工具XCTestCase
  9. linux创建新用户及权限
  10. 配置tomcat全局c3p0连接池