列表理解中的条件没有索引错误

时间:2015-09-24 07:24:41

标签: python list indexing list-comprehension

当我运行代码时:

mylist = []
mylist[1]

我得到IndexError:列表索引超出范围。这对我来说很有意义。但是当我运行以下代码时:

mylist = []
newlist = [x for x in mylist if mylist[1] == 'mystring']
print(newlist)

我没有得到索引错误,只是打印一个空列表。这就是我想要的代码,但我不明白它为什么不给我和IndexError。据我所知,这只发生在列表为空时,否则如果您将列表索引到范围之外,则可能会出现索引错误。例如:

mylist = ['string']
newlist = [x for x in mylist if mylist[1] == 'mystring']

返回我希望它返回的IndexError。

如果有人可以帮助解释为什么如果你有一个条件语句在列表推导中指定一个空列表的索引,你就不会得到一个索引错误,这太棒了。

4 个答案:

答案 0 :(得分:3)

这与条件和理解无关。事实上,迭代空序列或集合不会产生迭代。请注意以下代码块如何在for循环中不产生错误,即使未定义x

>>> a = 0
>>> for i in []:
...     x = x + 2
...
>>> a
0
>>> x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined

答案 1 :(得分:2)

由于mylist已经为空,for x in mylist将永远不会迭代,因此永远不会执行if检查。同样的事情也适用于普通for循环:

>>> mylist = []
>>> for x in mylist:
...     print "second item", mylist[1]

# will print nothing

答案 2 :(得分:1)

[x for x in mylist if mylist[1] == 'mystring']中,每次迭代都会执行if mylist[1] == 'mystring'子句 - 但由于mylist为空,因此迭代完全为零,因此根本不会执行。

答案 3 :(得分:0)

if mylist[1] == 'mystring'中的每个值评估表达式mylist

由于mylist为空,表达式永远不会被评估。