2012-03-29 92 views
2

我正在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循环的结尾,并尝试比较文本[i:](其为空)和potential_suffix,在这种情况下为空。代码到达最后并返回False,这会导致while循环永远持续。

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

有什么基础我失踪了?为什么两个空串不会被视为相等?

+2

你熟悉的'.endswith'方法,什么'text.endswith(potential_suffix)'和'text.endswith(tuple_of_suffixes)'做什么? – DSM 2012-03-29 23:34:27

+0

@DSM这应该是一个答案,而不是一个评论,因为它是正确的答案。 :) – 2012-03-30 01:41:46

+0

@DSM没有先生,我不熟悉。我现在是!非常感谢。 – Paragon 2012-03-30 14:28:55

回答

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):] 
+0

范围正是问题所在。我在想这是一个更根本的缺乏知识!谢谢。关于额外的帮助,我很欣赏它,但有一些额外的功能可以进入它(需要额外的代码)。我只需要了解基础知识。 – Paragon 2012-03-29 23:44:20

+2

循环真的很愚蠢;显然只有一个可能发生匹配的'i'值。 – 2012-03-29 23:53:44

1

我认为你是假的,而不是真实的,当你认为它比较两个空字符串退出您is_suffix()功能的原因是因为你的range(len())

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

如果文本是一个空字符串,然后len(text) == 0range(0) == []所以你从来没有真正做过循环,因为列表是空的。

你可以迅速改变它,看看是否它的工作原理:

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