python中隐式的内存共享
在python中,基本上使用的是引用,那么就会造成一个隐式的内存共享,特别是在容器对象中,例如list,dictionary
对于不可变对象,是不会造成隐式的内存共享情况,如下所示:
>>> alist = [0]*5
>>> print alist
[0, 0, 0, 0, 0]
>>> alist[0]= 'kel'
>>> alist
['kel', 0, 0, 0, 0]
以上为不可变对象数字类型,数字是不可变对象,在每次都会新建这一对象。
>>> alist = ['kel']*5
>>> alist
['kel', 'kel', 'kel', 'kel', 'kel']
>>> alist[0]='changed'
>>> alist
['changed', 'kel', 'kel', 'kel', 'kel']
字符串也是不可变类型,从而在修改一个对象的时候,其他的对象都会重新建立
在多维数组列表中,则会造成隐式的内存共享,也就是修改其中一个的值其他的值也会发生改变,如下所示:
>>> multi = [[0]*5]*3
>>> multi
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
>>> multi[0][0]='kel'
>>> multi
[['kel', 0, 0, 0, 0], ['kel', 0, 0, 0, 0], ['kel', 0, 0, 0, 0]]
当使用列表解析的时候,会造成隐式内存共享,在每次使用的时候,都是指向同一个对象,具体的如下所示:
>>> row = [0]*5
>>> multi = [row]*3
>>> multi
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
>>> multi[0][0]='kel'
>>> multi
[['kel', 0, 0, 0, 0], ['kel', 0, 0, 0, 0], ['kel', 0, 0, 0, 0]]
1、 row中的五个子项都引用0 -——在这个时候修改其中之一的值,不会影响其他的值,因为是不可变对象
2、multi中的3个子项都引用row——从而在修改最里面的值的时候,都会影响其他的值,因为指向的是同一个对象row
如果对象是不可变的,则对象和对象引用实际上没什么区别。
要解决内存共享的问题,那么可以使用双层循环的列表解析,而不是使用直接使用重复的列表解析:
>>> mmultilist = [[0 for x in range(3)] for x in range(5)]
>>> mmultilist
[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> mmultilist[0][0]='kel'
>>> mmultilist
[['kel', 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
在进行修改的时候,没有影响到其他的值,从而这种方法是可以的。
另外,在使用这种双层循环的方式中,可以对开始的进行简化,从而代码如下:
>>> multilist=[[0]*3 for x in range(5)]
>>> multilist
[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> multilist[0][0] = 'kel'
>>> multilist
[['kel', 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
当直接使用列表乘以整数的时候,可以直接得到列表的重复,注意在这里如果是不可变对象,那么可以使用;如果涉及到了几维数据的话,那么就必须使用其中的循环从而消除对内存共享的影响。
此种问题对于可变对象才会发生,而对于不可变对象是不会发生的。
python中隐式的内存共享的更多相关文章
- python 中的Array,Value及内存共享
官网文档的例子 from multiprocessing import Process, Value, Array def f(n, a): n.value = 3.1415927 for i in ...
- python是如何进行内存管理的
Python引入了一个机制:引用计数. python内部使用引用计数,来保持追踪内存中的对象,Python内部记录了对象有多少个引用,即引用计数,当对象被创建时就创建了一个引用计数,当对象不再需要时, ...
- python面试题之Python是如何进行内存管理的
python内部使用引用计数,来保持追踪内存中的对象,Python内部记录了对象有多少个引用,即引用计数,当对象被创建时就创建了一个引用计数,当对象不再需要时,这个对象的引用计数为0时,它被垃圾回收. ...
- 孤荷凌寒自学python第三十七天python的文件与内存变量之间的序列化与反序列化
孤荷凌寒自学python第三十七天python的文件与内存变量之间的序列化与反序列化 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.什么是序列化与反序列化 序列化是指将内存中的数据进行指 ...
- Python是如何进行内存管理
三个方面:一对象的引用计数机制,二垃圾回收机制,三内存池机制 一.对象的引用计数机制 Python内部使用引用计数,来保持追踪内存中的对象,所有对象都有引用计数. 引用计数增加的情况: 1,一个对象分 ...
- python是如何进行内存管理的?
Python内存管理机制 Python内存管理机制主要包括以下三个方面: 引用计数机制 垃圾回收机制 内存池机制 引用计数 举个例子说明引用是什么: 1 如上为一个简单的赋值语句,1就是对象,a就是引 ...
- <Python基础>python是如何进行内存管理的
.Python 是如何进行内存管理的?答:从三个方面来说,一对象的引用计数机制,二垃圾回收机制,三内存池机制⒈对象的引用计数机制Python 内部使用引用计数,来保持追踪内存中的对象,所有对象都有引用 ...
- Python推导式详解,带你写出比较精简酷炫的代码
Python推导式详解,带你写出比较精简酷炫的代码 前言 1.推导式分类与用法 1.1 列表推导 1.2 集合推导 1.3 字典推导 1.4 元组推导?不存在的 2.推导式的性能 2.1 列表推导式与 ...
- Python正则式的基本用法
Python正则式的基本用法 1.1基本规则 1.2重复 1.2.1最小匹配与精确匹配 1.3前向界定与后向界定 1.4组的基本知识 2.re模块的基本函数 2.1使用compile加速 2.2 ma ...
随机推荐
- Linux系统文件的隐藏属性
linux系统的文件除了有普通rwx权限外还有一种隐藏权限,例如明明有权限删除某个文件却报错了. 或者仅能为某个文件追加内容而不能减少内容,遇到这种很‘奇怪’的文件,就要怀疑是文件被设置隐藏权限了. ...
- AdventureWorksDW2008R2 attach: Unable to open the physical file. Operating system error 5: "5(Access is denied.)
http://stackoverflow.com/questions/26014133/adventureworksdw2008r2-attach-unable-to-open-the-physica ...
- Hadoop namenode无法启动问题解决
原因:在root账户(非hadoop账户)下操作hadoop会导致很大的问题 首先运行bin/start-all.sh发现namenode没有启动 只有它们 9428 DataNode 9712 Jo ...
- URAL 1250 Sea Burial 简单Floodfill
问这个人掉落的海域包含几个岛屿. 八方向相连为同一片海域,四方向相连为同一个岛屿.与边界相连的岛屿不算. 方法:在给定地图外面填充一圈".",从这个人掉落的地方开始进行floodf ...
- 笔记二、本地git命令
参考书籍: <Pro Git>中文版.pdf git init // 建立一个git仓库, 本地目录为工作目录, .git目录是中央数据目录 git ini ...
- DOJO 八 event dojo/on
官网教程:Events with Dojo在元素上绑定events,需要引用包dojo/on,通过on方法来实现. <button id="myButton">Clic ...
- [POJ2777]Count Color(线段树)
题目链接:http://poj.org/problem?id=2777 给你一个长为L想线段,向上面染色,颜色不超过30种,一共有O次操作,操作有两种: C a b c 在[a,b]上染上c颜色 P ...
- 利用XPath读取Xml文件
之所以要引入XPath的概念,目的就是为了在匹配XML文档结构树时能够准确地找到某一个节点元素.可以把XPath比作文件管理路径:通过文件管理路 径,可以按照一定的规则查找到所需要的文件:同样,依据X ...
- JavaScript高级编程(一)
书中第2章,在HTML中使用JavaScript摘要总结 2.1 <script>元素 <script>中的5个属性:charset:可选.表示通过src属性指定的代码的字符集 ...
- ViewPager的监听事件失效
主要是因为在我项目使用了PageIndicator,所以这个时候监听事件要写在PageIndicator上. mIndicator.setOnPageChangeListener(new OnPage ...