Python:TypeError:' str'对象不支持项目分配

时间:2016-06-24 14:18:45

标签: python typeerror

我在制作一个简单的战舰游戏时遇到了这个问题。这是我的代码:

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)

我试图重新分配导弹用“X&X”打击的地方。但后来它说了

  

TypeError:&#39; str&#39;对象不支持项目分配。

2 个答案:

答案 0 :(得分:2)

for i in range(5): #<<<<determine the board size here
    board.append(joined_O)

这对我来说不合适。您应该将列表附加到board,而不是字符串。我猜你以前有类似的东西:

for i in range(5):
    board.append(row)

哪个至少是正确的类型。但是当你错过一艘船的时候,你会遇到奇怪的错误,其中五个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

答案 1 :(得分:1)

看看:

board = []
row = ['O'] * 5 #<<<<determine the board size here 
joined_O = '  '.join(row)
  • board是一个列表。
  • 行是一个列表。
  • joined_O是通过连接row的元素形成的字符串。

for i in range(5):  #<<<<determine the board size here
    board.append(joined_O)
    print(joined_O)

board现在是一个字符串列表

所以

board[int(missile_row)][int(missile_col)] = 'X'

不是有效命令,因为它试图修改板列表中的字符串而不是2D列表中的元素。在Python中,字符串是不可变的,因此您无法就地更改其字符。

简而言之,board不是代码中的2D列表,而是字符串列表。