2012-01-03 52 views
9

Tôi hiện đang học python từ một cuốn sách có tên 'Python cho người mới bắt đầu tuyệt đối (ấn bản thứ ba)'. Có một bài tập trong cuốn sách vạch ra mã cho một trò chơi treo cổ. Tôi theo cùng với mã này tuy nhiên tôi giữ lại một lỗi ở giữa chương trình.Lỗi Python: "IndexError: chỉ mục chuỗi nằm ngoài phạm vi"

Dưới đây là đoạn code mà gây ra vấn đề:

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 

Đây cũng là lỗi nó sẽ trả về:

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

một người nào đó có thể giúp tôi ra với những gì đang xảy ra sai và những gì tôi có thể làm gì để sửa nó?

sửa: Tôi khởi tạo biến so_far như vậy:

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

Điều này rất nhỏ và không liên quan đến câu hỏi của bạn, nhưng bạn không cần i = 0. Vòng lặp for sẽ tự động đặt biến vòng lặp khi nó bắt đầu ngay cả khi tôi chưa được xác định. –

+0

@Chad Đúng vậy. Tôi không thể nhớ lý do tại sao tôi bị mắc kẹt trong: S – Darkphenom

Trả lời

11

Dường như bạn đã thụt lề so_far = new quá nhiều. Hãy thử điều này:

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 tiền thưởng mắt đại bàng. – hochl

+0

Có cảm ơn bạn rất nhiều! Tôi thấy hơi bối rối khi chỉ có thụt đầu dòng cho những thứ mà tôi sẽ được sử dụng để đặt dấu ngoặc nhọn xung quanh! – Darkphenom

5

Bạn đang lặp lại hơn một chuỗi (word), nhưng sau đó sử dụng các chỉ số vào đó để tìm kiếm một nhân vật trong so_far. Không có gì đảm bảo rằng hai dây này có cùng chiều dài.

1

Lỗi này xảy ra khi số lần đoán (so_far) nhỏ hơn độ dài của từ. Bạn đã bỏ lỡ một khởi tạo cho biến so_far ở đâu đó, điều đó đặt nó thành một cái gì đó như

so_far = " " * len(word) 

?

Edit:

thử một cái gì đó giống như

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

trước dòng ném lỗi, vì vậy bạn có thể thấy chính xác những gì khó khăn. Điều duy nhất tôi có thể nghĩ đến là so_far nằm trong một phạm vi khác, và bạn không thực sự sử dụng cá thể bạn nghĩ.

+0

Xin lỗi tôi đã bao gồm điều này nhưng quên. Tôi đã có biến được khởi tạo theo cùng cách so_far = "-" * len (từ) – Darkphenom

+0

Đã chỉnh sửa phản hồi của tôi để thêm cách gỡ lỗi và một đề xuất khác về những gì có thể sai. – CNeo

+0

Và có vẻ như @Rob Wouters đã nhận được nó, tôi đã bỏ lỡ điều đó. Anh ấy đúng, so_far nên ở bên ngoài khối :) – CNeo

0

Có một số vấn đề trong mã của bạn. Ở đây bạn có một phiên bản chức năng bạn có thể phân tích (Cho phép thiết lập 'hello' là từ mục tiêu):

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') 

tôi đã cố gắng để viết nó cho py3k với một ide py2k, hãy cẩn thận với các lỗi.

+0

Tuyên bố ngắt của bạn sai ở đó. –

+1

Rob, bạn đang phải – joaquin

+0

Vâng tôi chỉ lấy ra một đoạn mã nhỏ để đạt được điểm. Cảm ơn bạn đã chỉ ra. – Darkphenom

Các vấn đề liên quan