

ある本を使って勉強しているのですが、本の通りにコードを書いてもエラーが出てしまいます。  
このコードは、アルファベットを一文字ずつ入力していき、隠された単語にそのアルファベットがあればその部分が明らかになっていくという単語当てゲームのようなものです。

いつもエラーが出てしまうわけではなく、入力した単語が隠された単語（下記のコードではcat）に含まれないときには正常に作動しますが `c, a, t`
のいずれかの文字を入力すると `'str' object does not support item assignment` というエラーが出てしまいます。

何が原因なのでしょうか。言葉足らずでしたら申し訳ございません。よろしくお願いいたします。  
以下コードです。  

[code]

    def hangman(word):
        wrong = 0
        stages = ["",
                  "________        ",
                  "|               ",
                  "|       |       ",
                  "|       〇      ",
                  "|      /|/　    ",
                  "|      / /      ",
                  "|               ",
                  ]
        rletters = list(word)
        board = "_"*len(word)
        win = False
        print ("ハングマンへようこそ！")
    
        while wrong < len(stages) - 1:
            print ("\n")
            msg = "1文字を予想してね！"
            char = input(msg)
            if char in rletters:
                cind = rletters.index(char)
                print(cind)
                board[cind] = char
                rletters[cind] = "$"
            else:
                wrong += 1
            print(" ".join(board))
            e = wrong + 1
            print("\n".join(stages[0:e]))
            if "_" not in board:
                print("あなたの勝ち")
                print(" ".join(board))
                win = True
                break
        if not win:
            print("\n".join(stages[0:wrong + 1]))
            print("あなたの負け!正解は {}.".format(word))
    
    hangman("cat")
    
[/code]


CC BY-SA 4.0
2021-02-10T06:31:21.217
73908
2021-02-10T07:04:38.600
2021-02-10T06:42:53.670
3060
43905
question
python python3
Python の 'str' object does not support item assignment というエラーについて

[code]

    board[cind] = char
    
[/code]

を

[code]

    board = board[:cind] + char + board[cind+1:]
    
[/code]

としたらどうでしょうか？

前者のような代入方法はもしかしたら Python2 の時は可能だったのかもしれませんが、Python3 ではできないようです。


CC BY-SA 4.0
2021-02-10T06:55:14.643
73909
2021-02-10T06:55:14.643
7290
73908
answer


発生個所付近のソース記述や：

[code]

    cind = rletters.index(char)
    print(cind)
    board[cind] = char
    rletters[cind] = "$"
    
[/code]

結果出力時のこれを見ると：

[code]

    print(" ".join(board))
    
[/code]

この記述で`board`が文字列になっているのが間違いで：

[code]

    board = "_"*len(word)
    
[/code]

その上の`rletters = list(word)`と同様に、リストにするのが一番修正量が少ないでしょう。

[code]

    board = list("_"*len(word))
    
[/code]


CC BY-SA 4.0
2021-02-10T07:04:38.600
73910
2021-02-10T07:04:38.600
26370
73908
answer