-1

par_list在此之前在某些代码中启动。对于我正在测试它的部分,"calendar"没有出现。那么为什么它将 if 语句评估为True

while cake:
    print "Length of par_list = ", len(par_lst)

    for rows in par_lst:
        if "calendar" or "Calendar" in rows:
            print "you shouldn't be here"
            writer.writerow(rows)
4

3 回答 3

11

那是因为你的代码应该是这样的:

if "calendar" in rows or "Calendar" in rows:

在 Python 中,非空字符串总是计算为True. 此外,您当前的代码与此基本相同:

if ("calendar") or ("Calendar" in rows):

这意味着此条件将始终返回True,因为"calendar"将始终是True。事实上,它甚至永远不会到达这个("Calendar" in rows)部分。

作为演示,请考虑以下情况:

>>> bool("calendar" or "Calendar" in rows)
True
>>>

请注意,即使我还没有定义rows,我也没有得到NameError. 相反,代码返回True. 那是因为,正如我上面所说,它甚至从未到达过"Calendar" in rows部分。事实上,它所做的只是评估"calendar"哪个作为非空字符串返回True

于 2013-09-27T15:47:44.220 回答
3
if "calendar" or "Calendar" in rows:

这总是正确的。"calendar"作为一个非零长度的字符串,它是真的,并且or'd with"Calendar" in rows总是真的。事实上,"Calendar" in rows甚至从未评估过,因为"calendar"它是真的。

你要:

if "calendar" in rows or "Calendar" in rows:

这不是最有效的,因为它实际上会搜索rows两次。要只搜索一次,请尝试:

if (row.lower() = "calendar" for row in rows):

但是,这实际上可能并不比搜索行两次快:首先是因为它是一个显式循环,其次是因为它在测试之前将每一行都小写了。它确实具有匹配任何大小写的优势,不仅是“日历”或“日历”,还包括“日历”或“日历”或其他任何内容。

现在,我觉得这可能仍然不是你想要的。除非其中一行恰好是字符串"calendar"(在任何情况下),否则这总是错误的。例如,如果您从文件中读取了列表,它可能包含行尾,这将使该测试无法匹配。或者字符串中可能有其他文本,而您只想测试每一行是否包含该单词。在这种情况下,写:

if any("calendar" in row.lower() for row in rows):
于 2013-09-27T15:50:09.560 回答
1
if "calendar" or "Calendar" in rows:

相当于

if "calendar" or ("Calendar" in rows):

既然"calendar"是真实的,条件就通过了。

于 2013-09-27T15:48:09.987 回答