概述
今天,公众号开启了一个全新的板块------python排雷区。
常用python的朋友肯定知道,很多时候,python的语法总是很迷。有些代码写上去,你觉得是对的,完美无缺的,但其实:
python不是这么想的
为了帮助大家在学习python的道路上走的更远,我们开启一个新的板块,那就是收集python学习过程中的坑,然后在这里呈现给大家。
如果大家在学习过程中遇到了什么有趣的“雷”,也可以在群里联系我们,然后分享在这里哦!
先给大家介绍第一个雷:
一号雷:for循环删除列表
我想给大家看一段代码,大家猜一猜运行的结果是什么
list1=[1,2,3,4,5,6]
for i in list1:
list1.remove(i)
print(list1)
很多小伙伴一看,直呼:哇塞,这么简单的代码,还用说嘛
list1是一个列表,里面有6个元素,分别是1,2,3,4,5,6。在for循环中,遍历了其中左右的元素,然后用list1.remove()一个个删除,最后打印出来的当然是一个空列表啦!
我给大家看看运行结果,看是不是一个惊喜
显然,这个结果和很多人想象的是不一样的。
因为python读取列表里面的元素是根据索引读取的,你在删除列表的元素的过程中,列表长度发生了变化,那么其中元素的索引也就要发生相应的变化,比如说,list1=[a,b,c]中,元素a的索引是0,元素b的索引是1,如果删除了元素a,那么元素b就到了第一个元素的位置,那它的索引就是0了。但这个时候,你如果还是按照1来读取列表,那么索引1读取的就是元素c了,这样,你删除操作不出问题才怪。
为了方便大家理解,我在for循环中增加一个print(i),将每次要操作的值打印出来。
显然,随着列表长度的变化,i的值没有按照我们想象中的方式变化,所以我们删除的是1,3,5。最终2,4,6是保留下来的。
解决办法
如果你真的要用for循环删除列表里面的元素,那可以用下面的办法。先设置一个list2,把list1拷贝到list2里面,然后在在for循环中对list2进行循环,删除其中的list1里面的元素。方法很靠谱,但是实际运行起来就是另一回事了。大家看一看。
哇,还是不对啊。
那就要引出今天的另一个主角
二号雷:变量拷贝与赋值
这里,就涉及到了另一个问题,那就是列表的赋值问题。我们看一看下面的代码。
我们设置list1,然后把list1的值赋值给另一个列表list2。然后我们将list1和list2的值打印出来。
我们发现二者的值是一样的,然后,我们在list1中删除元素1,对list2不进行任何操作,再将list1和list2打印出来的时候,我们发现list1和list2里面的元素1全部都没有了。
因为list1和list2用的是同一块内存,只是变量名不一样,我们用remove直接修改了那个内存里面的值,这样两个列表的值当然是都要变化。
我们需要将list1里面的值赋值给list2,这样的话,两个列表就完全独立了,修改list1就不会影响到list2。
方法就是这样
list2=list1.copy()
我们带入之前的修改list1的代码
这样就不会有任何问题了。
现在,回到一号雷
用copy进行拷贝,就是将list1里面的元素拷贝到list2里面,然后运行list2,删除list1里面的值,这样就不会有任何问题了。
代码如下
list1=[1,2,3,4,5,6]
list2=list1.copy()
for i in list2:
print(i)
list1.remove(i)
print(list1)
破案了,看下图
最后
以上就是懦弱小土豆为你收集整理的python排雷(一):for循环删除数组的全部内容,希望文章能够帮你解决python排雷(一):for循环删除数组所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复