为什么这个if语句为True

时间:2013-09-27 15:46:31

标签: python if-statement

在此之前的某些代码中启动了

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)

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

if "calendar" or "Calendar" in rows:

这总是如此。 "calendar"是一个非零长度的字符串,它是真的,而or'与"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”等等。

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

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

答案 2 :(得分:1)

if "calendar" or "Calendar" in rows:

相当于

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

由于"calendar"是真实的,条件会过去。