为什么两个空的字符串切片不能“平等”?

时间:2012-03-29 23:22:37

标签: python string list

我在使用Python。我有以下代码:

while not is_suffix(pattern[:k], pattern[:q]):
    k -= 1
    print k

def is_suffix(potential_suffix, text):
    print "|" + potential_suffix + "|" + text + "|"
    for i in range(len(text)):
        if potential_suffix == text[i:]:
            return True
    return False

(while循环实际上是一个函数,但我省略了不相关的代码)。结果是while循环永远存在。 is_suffix函数在找到两个相等的非空字符串时有效。但是,在我遇到问题的情况下,它到达for循环的末尾并尝试比较text [i:](为空)和potential_suffix,在这种情况下为空。代码到达结尾并返回False,这会导致while循环永远继续。

我声称这两个是空字符串,因为is_suffix中的打印行打印出“|||”在相关案件中。

有什么基础我不见了吗?为什么两个空字符串不能被认为是相等的?

2 个答案:

答案 0 :(得分:1)

当您认为比较两个空字符串时,我认为您使用False而不是True退出is_suffix()函数的原因是range(len())

for i in range(len(text)):
        if potential_suffix == text[i:]:
            return True

如果text是一个空字符串,那么len(text) == 0range(0) == []所以你从来没有实际循环,因为列表是空的。

您可以快速更改它,看看它是否有效:

if potential_suffix == text:
    return True
for i in xrange(len(text)):
        if potential_suffix == text[i:]:
            return True

答案 1 :(得分:1)

问题是,如果for,您永远不会经历text=""循环。然后,len(text) == 0range(0) == [],所以没有什么可循环的。您可能想要对该循环进行额外的迭代:

for i in range(len(text) + 1):

或明确检查空后缀:

if suffix == "":
    return True

在函数的开头。

但是,你在这个函数中做了很多额外的工作,因为循环是不必要的。以下将做你想要的:

def is_suffix(potential_suffix, text):
    return potential_suffix == text[-len(potential_suffix):]