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

No Index Error in Conditional within 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']

returns IndexError 我希望它是 return。

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

由于mylist已经是空的,for x in mylist永远不会迭代,所以if永远不会执行检查。同样的事情也适用于正常的 for 循环:

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

# will print nothing

[x for x in mylist if mylist[1] == 'mystring']中,每次迭代都会执行if mylist[1] == 'mystring'子句——但是由于mylist是空的,正好有零次迭代,所以根本不会执行。

这与条件句和推导式无关。这只是一个事实,即迭代一个空序列或集合不会产生迭代。请注意以下代码块如何在 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

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

由于 mylist 为空,因此永远不会计算表达式。