for循环中关于列表list中remove的坑(特别注意)

 前几天,使用python时遇到这么一个需求,删除一个列表中值为1的元素。我寻思着使用remove方法,但是remove方法只会删除第一个,于是我使用for循环去删除。代码和运行结果如下:

  当时这个结果让我很懵逼,为什么1没有被删除完?查了资料发现,是for循环捣的鬼。

因为for循环实际是循环的列表下标(索引),同时由于列表的可变性,每一次删除一个元素,列表的长度就会发生变化,元素的索引也会发生变化。

而remove是对值进行操作的

这里来具体分析一下这段代码:

  第一次循环,循环索引为0,此时索引为0的元素是1,满足条件,因此mylist中的第一个1被删除,此时mylist变为[1,2,1,1,3,4];

  第二次循环,循环索引为1,此时新列表中,索引为1的元素是2,不满足条件,mylist仍然为[1,2,1,1,3,4];

  第三次循环,循环索引为2,此时列表中,索引为2的元素是1,满足条件,remove方法会再次删除一个1,但是remove会删除第一次出现的1(即删除索引为0的那个1),因此列表变为[2,1,1,3,4];

  第四次循环,循环索引为3,新列表中,索引为3的元素是3,不满足条件,mylist仍然为[2,1,1,3,4];

  第五次循环,循环索引为4,此时列表中,索引为4的元素是4,不满足条件,mylist仍然为[2,1,1,3,4];

  此时,由于新列表长度为5,于是循环结束。

   下面的截图结果能够很直观的看出来。

  至此,如果是这样的一段代码,结果应该是怎样?

  最终mylist=['b','d'],怎么样,和你计算的值是否一样?

  回到最初的需求,要怎样才能删除所有的1,这里可以使用deepcopy来复制一份,之后一个列表用于循环,一个用于移除值。

这里还得讲一下浅拷贝和深拷贝。

浅拷贝是什么呢?浅拷贝是在复制的时候只增加了一个指针,没有给其分配了内存空间,即你原来有一个a列表,你这个a里的值都有指向自己的指针,而且也有自己的内存空间a1,当浅拷贝a列表的时候得到一个A,这个A里的值都有指向自己的指针,但是他的的内存空间还是a1;这个时候你对无论是a还是A进行操作,都会改变内存空间a1里的值。

深拷贝是什么呢?深拷贝是在复制的时候不但增加了一个指针,而且还给其分配了内存空间,即你原来有一个a列表,你这个a里的值都有指向自己的指针,而且也有自己的内存空间a1,当深拷贝a列表的时候得到一个A,这个A里的值都有指向自己的指针,而且也有自己的内存空间A1;那么你再对原来的进行操作的时候可以去a里去寻找,在A里进行操作,由于都有自己的独立的内存空间,那么不会相互影响。就可以避免遗漏值,出现错误。

代码和结果如下:

  这样就可以实现删除列表中的所有值为1的元素。

转载文章: https://blog.csdn.net/guan666/article/details/71511948

https://www.cnblogs.com/lipx9527/p/9450819.html

  • 17
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值