我是靠谱客的博主 懦弱小土豆,最近开发中收集的这篇文章主要介绍python排雷(一):for循环删除数组,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

今天,公众号开启了一个全新的板块------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循环删除数组所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部