2012-03-29 94 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 
相關問題