我很难理解为什么如果切换了序列,当这行代码起作用时为什么会有该行的回溯。
代码行是:1)if words[0] != "From" or len(words) < 1 :
(第9行,左侧文件,提供回溯)
2)if len(words) < 1 or words[0] != "From" :
(第10行,右文件,有效)
我尝试用有效的“工作”行替换左侧的行。所以我很好奇为什么序列中需要具体说明。
发生这种情况是因为当您致电:if len(words) < 1 or words[0] != "From"
将根据表达式的出现顺序对其求值,首先是len(words) < 1
,然后是words[0] != "From"
。当代码在评估第一个表达式为true时正在评估or
表达式时,解释器将不会对第二个表达式求值,因为这无关紧要,它将输出true。
[当您调用if words[0] != "From" or len(words) < 1
时,解释器将对表达式words[0] != "From"
求值,因为这些单词是一个空列表,您将收到索引错误,因为数组中不存在索引0。
通过您可以将表情恢复到if not words or words[0] != "From"
在第一种情况下,您正在访问单词列表中的第一项(words [0],但是如果列表为空,则索引超出范围,这会在Python中产生错误。
在秒数的情况下(起作用的行),您首先要检查列表是否为空(少于1个项目)。在Python中,布尔值“ and”和“ or”是短路运算符。这意味着,如果“或”之前的条件为真,则不会评估“或”之后的条件。因此,它不会尝试访问越界索引。