当我运行代码时:
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。
如果有人可以帮助解释为什么如果你有一个条件语句在列表推导中指定一个空列表的索引,你就不会得到一个索引错误,这太棒了。
答案 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
为空,表达式永远不会被评估。