Невозможно назначить строку в мой массив / список в Python

Я получаю следующую ошибку:

Traceback (most recent call last):
  File "battleships.py", line 120, in <module>
    lines[num - 1][let - 1] = symbol2
TypeError: 'str' object does not support item assignment

Я все еще довольно нубист в Python и думал, что я буду давать линкоры, как часть моего учебного процесса. Я понимаю, что у меня проблемы с назначением строкового объекта в моем списке, но у меня есть более ранняя версия моего кода, в которой та же концепция кода работает плавно, поэтому я в растерянности. Я пробовал разные вещи, конвертируя переменные в строки тут и там, но мой проект перерос мне голову, и мне нужна помощь, чтобы найти проблему.

Вот мой код:

1 import random
  2
  3
  4
  5 def crtboard(size,symbol):
  6         x, y = size, size
  7         board = [[symbol for i in range(x)] for ii in range(y)]
  8         return board
  9
 10 def crtships(board,boardsize):
 11
 12         shipcount2 = 0
 13         shipcount3 = 0
 14         shipcount4 = 0
 15         shipcount5 = 0
 16         symbol1 = '*'
 17
 18         while shipcount2 < ship2:
 19                                 randint = random.randint(0,1)
 20                                 randlet = random.randint(0,boardsize - 1)
 21                                 randnum = random.randint(0,boardsize - 1)
 22                                 if randint == 0 and randnum < (boardsize - 1) and board[randlet][randnum] != symbol1 and board[randlet][randnum] != symbol1 and board[randlet][randnum + 1] != symbol1:
 23                                         board[randlet][randnum] = symbol1
 24                                         board[randlet][randnum + 1] = symbol1
 25                                         shipcount2 += 1
 26                                 if randint == 1 and randlet < (boardsize - 1) and board[randlet][randnum] != symbol1 and board[randlet][randnum] != symbol1 and board[randlet + 1][randnum] != symbol1:
 27                                         board[randlet][randnum] = symbol1
 28                                         board[randlet + 1][randnum] = symbol1
 29                                         shipcount2 += 1
 30
 31         while shipcount3 < ship3:
 32                                 randint = random.randint(0,1)
 33                                 randlet = random.randint(0,boardsize - 1)
 34                                 randnum = random.randint(0,boardsize - 1)
 35                                 if randint == 0 and randnum < (boardsize - 2) and board[randlet][randnum] != symbol1 and board[randlet][randnum] != symbol1 and board[randlet][randnum + 1] != symbol1 and board[randlet][randnum + 2] !=     symbol1:
 36                                         board[randlet][randnum] = symbol1
 37                                         board[randlet][randnum + 1] = symbol1
 38                                         board[randlet][randnum + 2] = symbol1
 39                                         shipcount3 += 1
 40                                 if randint == 1 and randlet < (boardsize - 2) and board[randlet][randnum] != symbol1 and board[randlet][randnum] != symbol1 and board[randlet + 1][randnum] != symbol1 and board[randlet + 2][randnum] !=     symbol1:
 41                                         board[randlet][randnum] = symbol1
 42                                         board[randlet + 1][randnum] = symbol1
 43                                         board[randlet + 2][randnum] = symbol1
 44                                         shipcount3 += 1
 45
 46         while shipcount4 < ship4:
 47                                 randint = random.randint(0,1)
 48                                 randlet = random.randint(0,boardsize - 1)
 49                                 randnum = random.randint(0,boardsize - 1)
 50                                 if randint == 0 and randnum < (boardsize - 3) and board[randlet][randnum] != symbol1 and board[randlet][randnum] != symbol1 and board[randlet][randnum + 1] != symbol1 and board[randlet][randnum + 2] !=     symbol1 and board[randlet][randnum + 3] != symbol1:
 51                                         board[randlet][randnum] = symbol1
 52                                         board[randlet][randnum + 1] = symbol1
 53                                         board[randlet][randnum + 2] = symbol1
 54                                         board[randlet][randnum + 3] = symbol1
 55                                         shipcount4 += 1
 56                                 if randint == 1 and randlet < (boardsize - 3) and board[randlet][randnum] != symbol1 and board[randlet][randnum] != symbol1 and board[randlet + 1][randnum] != symbol1 and board[randlet + 2][randnum] !=     symbol1 and board[randlet + 3][randnum] != symbol1:
 57                                         board[randlet][randnum] = symbol1
 58                                         board[randlet + 1][randnum] = symbol1
 59                                         board[randlet + 2][randnum] = symbol1
 60                                         board[randlet + 3][randnum] = symbol1
 61                                         shipcount4 += 1
 62
 63         while shipcount5 < ship5:
 64                                 randint = random.randint(0,1)
 65                                 randlet = random.randint(0,boardsize - 1)
 66                                 randnum = random.randint(0,boardsize - 1)
 67                                 if randint == 0 and randnum < (boardsize - 4) and board[randlet][randnum] != symbol1 and board[randlet][randnum] != symbol1 and board[randlet][randnum + 1] != symbol1 and board[randlet][randnum + 2] !=         symbol1 and board[randlet][randnum + 3] != symbol1 and board[randlet][randnum + 4] != symbol1:
 68                                         board[randlet][randnum] = symbol1
 69                                         board[randlet][randnum + 1] = symbol1
 70                                         board[randlet][randnum + 2] = symbol1
 71                                         board[randlet][randnum + 3] = symbol1
 72                                         board[randlet][randnum + 4] = symbol1
 73                                         shipcount5 += 1
 74                                 if randint == 1 and randlet < (boardsize - 4) and board[randlet][randnum] != symbol1 and board[randlet][randnum] != symbol1 and board[randlet + 1][randnum] != symbol1 and board[randlet + 2][randnum] !=         symbol1 and board[randlet + 3][randnum] != symbol1 and board[randlet + 4][randnum] != symbol1:
 75                                         board[randlet][randnum] = symbol1
 76                                         board[randlet + 1][randnum] = symbol1
 77                                         board[randlet + 2][randnum] = symbol1
 78                                         board[randlet + 3][randnum] = symbol1
 79                                         board[randlet + 4][randnum] = symbol1
 80                                         shipcount5 += 1
 81
 82
 83 #####################################################    MAIN    ######################################################
 84
 85 boardsize2 = 9
 86 symbol4 = 'W'
 87 seeboardpc = crtboard(boardsize2,symbol4)
 88 seeboardu = crtboard(boardsize2,symbol4)
 89 noseeboardpc = crtboard(boardsize2,symbol4)
 90 noseeboardu = crtboard(boardsize2,symbol4)
 91 symbol1 = '*'
 92 symbol2 = 'S'
 93 symbol3 = 'H'
 94
 95 ship2 = input("How many 2x1 ships do want?:")
 96 ship3 = input("How many 3x1 ships do want?:")
 97 ship4 = input("How many 4x1 ships do want?:")
 98 ship5 = input("How many 5x1 ships do want?:")
 99 tal = 1
100 letterB = 'A'
101 listA = []
102 zz = 0
103 while zz < boardsize2:
104         listA.append(letterB)
105         letterB = (chr(ord(letterB)+1))
106         zz += 1
107
108 crtships(noseeboardu,boardsize2)
109 crtships(noseeboardpc,boardsize2)
110
111
112 for line in noseeboardu:
113         print('%d' % tal +'%s
' % str(line))
114         tal += 1
115
116 for lines in noseeboardu:
117         while '*' in lines:
118                 let = input("Shoot column example A: ")
119                 num = input("Shoot row example 2: ")
120                 lines[num - 1][let - 1] = symbol2
121                 print(Ɔ' + str(listA))
122                 tal = 1
123                 for lines in noseeboardu:
124                         print('%d' % tal +'%s
' % str(line))
125                         tal += 1
126
127 print('game over')

Всего 1 ответ


Ошибка объясняет, что вы пытаетесь изменить значение в строке, как, например, в

my_string =  "foo"
my_string[0] = "a"

Так что это означает, что у вас есть проблема с типом. В строке 120 lines[num - 1] - это строки, а не lines[num - 1][let - 1]

Сначала попробуйте использовать оператор print перед строкой ошибки (120): тип, значение и т. Д.

Для более сложной ситуации вы можете использовать интерактивный отладчик, если хотите, как ipdb.


Есть идеи?

10000