2012-01-03 16 views
9

Obecnie uczę się Pythona z książki o nazwie "Python dla absolutnego początkującego (trzecia edycja)". W książce znajduje się ćwiczenie opisujące kod gry dla kata. Śledziłem wraz z tym kodem, ale wciąż otrzymuję błąd w środku programu.Błąd w języku Python: "IndexError: indeks ciągów poza zakresem"

Oto kod, który jest przyczyną problemu:

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 

Jest to również błąd powraca:

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

Może ktoś mi pomóc z tym, co jest nie tak i co mogę zrobić, aby to naprawić?

edit: I zainicjowany zmienna so_far tak:

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

Jest to niewielki i niezwiązany z pytaniem, ale nie potrzebujesz i = 0. Pętla for automatycznie ustawia zmienną pętli po uruchomieniu, nawet jeśli nie został jeszcze zdefiniowany. –

+0

@Chad Tak, twoje prawo. Nie pamiętam, dlaczego tak utknąłem: S – Darkphenom

Odpowiedz

11

Wygląda na to, że zbyt mocno naciągnąłeś so_far = new. Wypróbuj to:

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 bonus za oko orła. – hochl

+0

Tak, dziękuję bardzo! Uważam, że trochę zagmatwane jest po prostu wcięcie dla rzeczy, które byłyby przyzwyczajone do umieszczania nawiasów klamrowych! – Darkphenom

5

Jesteś iteracji przez jeden ciąg (word), ale następnie przy użyciu indeksu na to patrzeć charakter w so_far. Nie ma gwarancji, że te dwa łańcuchy mają tę samą długość.

1

Ten błąd wystąpiłby, gdy liczba domysłów (so_far) jest mniejsza niż długość słowa. Czy dotarł do inicjalizacji zmiennej so_far gdzieś, że ustawia go do czegoś podobnego

so_far = " " * len(word) 

?

Edit:

spróbować czegoś podobnego

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

przed linią, która rzuca błąd, dzięki czemu można dokładnie zobaczyć, co się dzieje źle. Jedyne, co mogę wymyślić, to to, że so_far ma inny zakres i faktycznie nie używasz instancji, którą myślisz.

+0

Przepraszam, że powinienem to uwzględnić, ale zapomniałem. Już wcześniej ta zmienna została zainicjowana w ten sam sposób, co so_far = "-" * len (słowo) – Darkphenom

+0

Zmieniono moją odpowiedź, aby dodać sposób debugowania i inną sugestię co do tego, co może być nie tak. – CNeo

+0

Wygląda na to, że @Rob Wouters to dostał, tęskniłem za tym. Ma rację, więc powinno być poza blokiem :) – CNeo

0

Wystąpiło kilka problemów w kodzie. Tutaj masz funkcjonalną wersję można analizować (Pozwala ustawić „cześć” jako słowo docelowej):

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

Starałem się napisać to dla py3k z ide py2k, należy uważać z błędami.

+0

Twoja instrukcja break jest tam nieprawidłowa. –

+1

Rob, masz rację. – joaquin

+0

Tak, tylko wyciągnąłem mały fragment kodu, żeby dojść do rzeczy. Dzięki za wskazanie. – Darkphenom

Powiązane problemy