python排雷(一):for循环删除数组

本文揭示了Python编程中常见的两个陷阱:for循环删除列表导致的索引混乱和变量拷贝与赋值的问题。通过实例演示,教你如何避免这些错误,正确使用拷贝和循环操作列表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天,公众号开启了一个全新的板块------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)

破案了,看下图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值