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

Python 条件内列表理解中没有索引错误,python,list,indexing,list-comprehension,Python,List,Indexing,List Comprehension,当我运行代码时: mylist = [] mylist[1] 我得到索引器:列表索引超出范围。这对我来说很有意义。但当我运行以下代码时: mylist = [] newlist = [x for x in mylist if mylist[1] == 'mystring'] print(newlist) 我没有得到索引错误,它只是打印一个空列表。这就是我想要代码做的,但我不明白为什么它不给我和indexer。据我所知,只有当列表为空时才会发生这种情况,否则,如果索引列表超出范围,则可能会出现

当我运行代码时:

mylist = []
mylist[1]
我得到索引器:列表索引超出范围。这对我来说很有意义。但当我运行以下代码时:

mylist = []
newlist = [x for x in mylist if mylist[1] == 'mystring']
print(newlist)
我没有得到索引错误,它只是打印一个空列表。这就是我想要代码做的,但我不明白为什么它不给我和indexer。据我所知,只有当列表为空时才会发生这种情况,否则,如果索引列表超出范围,则可能会出现索引错误。例如:

mylist = ['string']
newlist = [x for x in mylist if mylist[1] == 'mystring']
返回我希望它返回的索引器


如果有人能帮助解释为什么在列表理解中,如果有一个条件语句指定空列表的索引,就不会出现索引错误,那将是非常棒的。

因为
mylist
已经是空的,
对于mylist中的x
将永远不会迭代,所以
If
检查将永远不会执行。同样的情况也适用于正常的
循环:

>>> 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
为空,因此完全没有迭代,因此根本不会执行它。

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

>>> 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
>a=0
>>>对于[]中的我:
...     x=x+2
...
>>>a
0
>>>x
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
名称错误:未定义名称“x”

表达式
如果mylist[1]==“mystring”
针对
mylist
中的每个值进行计算


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

请注意:使用
mylist[1]
您试图访问列表的第二个元素,而不是第一个元素。列表中的第一个元素是
list[0]
,第二个元素是
list[1]
,依此类推。为了示例,索引级别是任意的。