前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python编程中一定要注意的那些“坑”(二)

Python编程中一定要注意的那些“坑”(二)

作者头像
Python小屋屋主
发布2018-04-16 16:34:17
7370
发布2018-04-16 16:34:17
举报
文章被收录于专栏:Python小屋

之前发过一些坑,请参考Python编程中一定要注意的那些“坑”(一)Python函数默认值参数的2个坑

今天说说列表的内存自动伸缩带来的坑。

假设有个列表如下,现在下删除其中的所有1,于是编写了如下代码

>>> x = [1, 2, 1, 2, 1, 2, 1, 2] >>> for item in x: if item == 1: x.remove(item)

>>> x [2, 2, 2, 2]

看上去完全正确,但实际上这段代码是有问题的,继续往下看

>>> x = [1, 2, 1, 2, 1, 1, 1, 1] >>> for item in x: if item == 1: x.remove(item)

>>> x [2, 2, 1, 1]

同样的代码,仅仅是要处理的列表发生了一点点变化,结果并没有删除所有的1,问题出在哪里呢?粗略一想,列表的remove()方法是删除参数的第一次出现,无法指定下标位置,是这个问题吗?看看下面的代码就知道了

>>> x = [1, 2, 1, 2, 1, 1, 1, 1] >>> for i in range(len(x)): if x[i] == 1: del x[i]

Traceback (most recent call last): File "<pyshell#170>", line 2, in <module> if x[i] == 1: IndexError: list index out of range >>> x [2, 2, 1, 1]

不但没有解决问题,反而引发了一个异常,下标越界。但这个异常似乎揭示了问题所在。下标越界,为什么会下标越界呢?难道是删除了列表中的元素导致元素个数减少并且影响了后续元素的索引?

>>> x = [1, 2, 1, 2, 1, 1, 1, 1] >>> for i in range(len(x)): print(i, x) if x[i] == 1: del x[i]

0 [1, 2, 1, 2, 1, 1, 1, 1] 1 [2, 1, 2, 1, 1, 1, 1] 2 [2, 2, 1, 1, 1, 1] 3 [2, 2, 1, 1, 1] 4 [2, 2, 1, 1] Traceback (most recent call last): File "<pyshell#177>", line 3, in <module> if x[i] == 1: IndexError: list index out of range

好像真的是这个问题,为了更好地理解这个问题,看下面的代码

>>> x = [(0,1),(1,1),(2,1),(3,1),(4,1),(5,1)] >>> for i in range(len(x)): print(i, x) if x[i][1] == 1: del x[i]

0 [(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1)] 1 [(1, 1), (2, 1), (3, 1), (4, 1), (5, 1)] 2 [(1, 1), (3, 1), (4, 1), (5, 1)] 3 [(1, 1), (3, 1), (5, 1)] Traceback (most recent call last): File "<pyshell#183>", line 3, in <module> if x[i][1] == 1: IndexError: list index out of range >>> x [(1, 1), (3, 1), (5, 1)]

好了,问题的原因已经确定了,那么正确的代码该怎么写呢?既然从列表中间位置删除元素会导致后面的元素索引发生改变,那么就从后往前删除好了。

>>> x = [1, 2, 1, 2, 1, 1, 1, 1] >>> for i in range(len(x)-1, -1, -1): print(i, x) if x[i] == 1: del x[i]

7 [1, 2, 1, 2, 1, 1, 1, 1] 6 [1, 2, 1, 2, 1, 1, 1] 5 [1, 2, 1, 2, 1, 1] 4 [1, 2, 1, 2, 1] 3 [1, 2, 1, 2] 2 [1, 2, 1, 2] 1 [1, 2, 2] 0 [1, 2, 2] >>> x [2, 2]

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-02-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python小屋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档