Python: TypeError: объект 'str' не поддерживает назначение элемента
У меня есть эта проблема при создании простой игры с линкором. Вот мой код:
board = []
row = ['O'] * 5 #<<<<determine the board size here
joined_O = ' '.join(row)
for i in range(5): #<<<<determine the board size here
board.append(joined_O)
print(joined_O)
from random import randint #<<<< this code is to determine where the ship is. It is placed randomly.
ship_row = randint(1,len(board))
ship_col = randint(1,len(board))
print(ship_row,', ',ship_col,'\n')
print('Shoot missile to the ship')
missile_row = int(input('row : '))
missile_col = int(input('column: '))
#I really don't know where you're supposed to put the int() thingy so i put it everywhere
if int(missile_row) == int(ship_row) and int(missile_col) == int(ship_col):
print("Congratulation! You've hit the ship.")
break
elif int(missile_row) >= len(board) or int(missile_col) >= len(board):
print('Sorry! Area is out of range.')
break
else:
print('Missile missed the target')
board[int(missile_row)][int(missile_col)] = 'X'
print(board)
Я попытался переназначить "О, где ракета попала с" Х ", но потом она говорит
TypeError: объект 'str' не поддерживает назначение элемента.
for i in range(5): #<<<<determine the board size here
board.append(joined_O)
Мне это не подходит. Вам следует добавлять списки на board
, а не строки. Я предполагаю, что у вас раньше было что-то вроде:
for i in range(5):
board.append(row)
Это, по крайней мере, правильный тип. Но тогда у вас будут странные ошибки, когда вместо X вы увидите пять Xes, когда вы пропустите корабль. Это связано с тем, что каждая строка является одной и той же строкой; внесение изменений в один делает изменения для всех из них. Вы можете избежать этого, сделав копию строки каждый раз, используя трюк.
for i in range(5): #<<<<determine the board size here
board.append(row[:])
Теперь ваш Xes должен правильно назначить. Но print(board)
в вашем блоке else
будет немного уродливой. Вы можете легко отформатировать его без скобок и кавычек, используя пару быстрых соединений:
else:
print('Missile missed the target')
board[int(missile_row)][int(missile_col)] = 'X'
print("\n".join(" ".join(row) for row in board))
Теперь у вас есть неплохой результат.
Shoot missile to the ship
row : 1
column: 1
Missile missed the target
O O O O O
O X O O O
O O O O O
O O O O O
O O O O O
Смотреть на:
board = []
row = ['O'] * 5 #<<<<determine the board size here
joined_O = ' '.join(row)
- доска - это список. строка - это список. join_O - это строка, сформированная путем объединения элементов строки.
А ТАКЖЕ:
for i in range(5): #<<<<determine the board size here
board.append(joined_O)
print(joined_O)
доска теперь представляет список строк
Так
board[int(missile_row)][int(missile_col)] = 'X'
не является допустимой командой, потому что она пытается изменить строку в списке плат вместо элемента в 2D-списке. В Python строки неизменяемы, поэтому вы не можете изменить их символы на месте.
Короче говоря, плата не является 2D-списком в вашем коде, а списком строк.