python中关于list remove不得不说的秘密
来源:互联网 发布:明星互动软件 编辑:程序博客网 时间:2024/06/06 00:24
在python 中进行一次简单的列表循环,当用到remove时出现了一个很有趣的现象,
代码如下:
a=range(30)
for i in a :
if i%4!=0:
a.remove(i)
这段代码是在a里取i 当i不能够整除4 的时候,a就在自己里面删除这个时候的i 值,最后输出的a的结果应该是[0,4,8,12,16,20,24,28],结果真的是这样吗?不多说,直接粘图
这个时候出现的结果完全不一样,2,6,10这些根本不对,那么为什么啊?那么这里就得说一下for in和remove了,
For in 是对下标进行操作,而remove是对值进行操作
当你执行第一个的时候,a 里面的第一个数是0 现在不符合规则,然后跳过,进行下一个循环,第二个数是1, 符合规则,把a里的1删除,现在a的表成了
[0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]然该第二个了,因为for in是按照下标取值的,那么第二个就成了3而不是2,这个时候就会把2跳过,以后的类似,而remove是对值进行操作,那么你i传到下面什么值,它就会删除什么值。
那么如何解决这个问题呢?
这里还得讲一下浅拷贝和深拷贝。
浅拷贝是什么呢?浅拷贝是在复制的时候只增加了一个指针,没有给其分配了内存空间,即你原来有一个a列表,你这个a里的值都有指向自己的指针,而且也有自己的内存空间a1,当浅拷贝a列表的时候得到一个A,这个A里的值都有指向自己的指针,但是他的的内存空间还是a1;这个时候你对无论是a还是A进行操作,都会改变内存空间a1里的值。
深拷贝是什么呢?深拷贝是在复制的时候不但增加了一个指针,而且还给其分配了内存空间,即你原来有一个a列表,你这个a里的值都有指向自己的指针,而且也有自己的内存空间a1,当深拷贝a列表的时候得到一个A,这个A里的值都有指向自己的指针,而且也有自己的内存空间A1;那么你再对原来的进行操作的时候可以去a里去寻找,在A里进行操作,由于都有自己的独立的内存空间,那么不会相互影响。就可以避免遗漏值,出现错误。直接贴代码:
输出结果:[0, 4, 8, 12, 16, 20, 24, 28]
- python中关于list remove不得不说的秘密
- 关于switch不得不说的几点小秘密
- 浅谈Android中 Handler、Looper、Message不得不说的秘密
- JavaWEB中web.xml和servlet不得不说的秘密。
- IE9:九个不得不说的秘密
- AR技术不得不说的秘密
- Android NDK不得不说的秘密
- 不得不说的,关于struts2
- 关于递归,不得不说的
- write和read的不得不说的秘密
- mvc与三层架构不得不说的秘密
- Mysql与cmd不得不说的秘密
- Python 3 不得不说的事儿
- URL访问地址和Tomcat项目部署中不得不说的小秘密
- URL访问地址和Tomcat项目部署中不得不说的小秘密
- 关于Puppet不得不说的故事
- 关于生命周期不得不说的事儿
- 关于数据仓库不得不说的事儿
- 剑指offer-57.二叉树的下一个结点
- 2016年湖南省省赛A题
- 内核自带按键驱动的添加与测试
- C语言实验题-倒三角形
- LeetCode #476
- python中关于list remove不得不说的秘密
- 继续聊WPF
- hihoCoder 1514 : 偶像的条件(模拟+二分)
- 显示和隐藏(display属性)
- ButterKnife
- CentOS7-安装MySQL5.7
- 继续聊WPF——自定义滚动条
- echarts之基于geojson的自定义地图
- 操作系统之死锁与死锁的处理