2012-01-03 72 views
9

我目前正在從一本名爲「Python絕對初學者(第三版)」的書中學習python。這本書中有一個練習,它概述了一個hang子手遊戲的代碼。我跟着這個代碼,但是我一直在程序中間回來一個錯誤。Python錯誤:「IndexError:字符串索引超出範圍」

這是導致該問題的代碼:

if guess in word: 
    print("\nYes!", guess, "is in the word!") 

    # Create a new variable (so_far) to contain the guess 
    new = "" 
    i = 0 
    for i in range(len(word)): 
     if guess == word[i]: 
      new += guess 
     else: 
      new += so_far[i] 
     so_far = new 

這也是它返回的錯誤:

new += so_far[i] 
IndexError: string index out of range 

有人能幫助我是怎麼回事錯的,什麼我可以要解決它嗎?

編輯:我初始化的變量so_far像這樣:

so_far = "-" * len(word) 
+2

這是次要的,與您的問題無關,但您不需要i = 0。即使我尚未定義,for循環在啓動時自動設置循環變量。 – 2012-01-03 13:49:00

+0

@查德是你的權利。我不記得我爲什麼卡在:S – Darkphenom 2012-01-03 15:01:26

回答

11

它看起來像你縮進so_far = new太多。試試這個:

if guess in word: 
    print("\nYes!", guess, "is in the word!") 

    # Create a new variable (so_far) to contain the guess 
    new = "" 
    i = 0 
    for i in range(len(word)): 
     if guess == word[i]: 
      new += guess 
     else: 
      new += so_far[i] 
    so_far = new # unindented this 
+4

+1鷹眼獎金。 – hochl 2012-01-03 13:27:35

+0

非常感謝你!我覺得有一點讓人費解,因爲我只是想用一些東西來壓縮大括號! – Darkphenom 2012-01-03 14:58:29

5

你迭代一個字符串(word),但是如果使用了索引,要查找一個字符so_far。不能保證這兩個字符串具有相同的長度。

1

如果猜測次數(so_far)小於單詞的長度,則會發生此錯誤。你是否錯過了某個地方的變量so_far的初始化,它將其設置爲類似於

so_far = " " * len(word) 

編輯:

嘗試像

print "%d/%d" % (new, so_far) 

拋出錯誤前行,所以你可以看到什麼不順心。我能想到的唯一的事情就是so_far處於不同的範圍,而且你實際上並沒有使用你認爲的實例。

+0

對不起,我應該包括這個,但忘記了。我已經有了以同樣的方式初始化變量 so_far =「 - 」* len(word) – Darkphenom 2012-01-03 13:09:49

+0

編輯我的反應,添加一種調試方式,以及另一個建議,可能是錯誤的。 – CNeo 2012-01-03 13:20:03

+0

它看起來像@ Rob Wouters得到它,我錯過了。他是對的,so_far應該在阻擋之外:) – CNeo 2012-01-03 13:27:59

0

你的代碼有幾個問題。 在這裏你可以分析功能的版本(讓我們設置「你好」作爲目標詞):

word = 'hello' 
so_far = "-" * len(word)  # Create variable so_far to contain the current guess 

while word != so_far:   # if still not complete 
    print(so_far) 
    guess = input('>> ')  # get a char guess 

    if guess in word: 
     print("\nYes!", guess, "is in the word!") 

     new = "" 
     for i in range(len(word)): 
      if guess == word[i]: 
       new += guess  # fill the position with new value 
      else: 
       new += so_far[i] # same value as before 
     so_far = new 
    else: 
     print("try_again") 

print('finish') 

我試圖把它寫了py2k IDE py3k,小心的錯誤。

+0

你的休息聲明在那裏是錯誤的。 – 2012-01-03 13:35:33

+1

Rob,你是對的 – joaquin 2012-01-03 13:41:59

+0

是的,我只拿出一小段代碼來說明問題。感謝您指出它。 – Darkphenom 2012-01-03 14:59:50

相關問題