我在使用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中的打印行打印出“|||”在相关案件中。
有什么基础我不见了吗?为什么两个空字符串不能被认为是相等的?
答案 0 :(得分:1)
当您认为比较两个空字符串时,我认为您使用False而不是True退出is_suffix()
函数的原因是range(len())
for i in range(len(text)):
if potential_suffix == text[i:]:
return True
如果text是一个空字符串,那么len(text) == 0
和range(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) == 0
和range(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):]