2017-01-10 39 views
0

リスト内のリスト内の要素を置き換えるのが難しいです。 私のコードは次のとおりです。リスト内のリスト内の要素(リストのリスト)を置き換える方法は?

board_size = 2 
number_of_squares_on_board = board_size * board_size 


computers_places = [] 

while len(computers_places) < number_of_squares_on_board: 

    placing = random.randint(0, number_of_squares_on_board-1) 

    if placing not in computers_places: 
     computers_places.append(placing) 
     row = int(placing/board_size) 
     column = int(placing % board_size) 
     # print(computers_places) 
     print("\nplacing: ", placing) 
     print("col: ", column) 
     print("row: ", row) 

     column_list = board[column] 
     column_list[row] = "[X]" 

     print(board[column][row]) 
     print(board) 
     print(computers_places) 

次のように出力されている:

placing: 1 
col: 1 
row: 0 
[X] 
[['[X]', '[ ]'], ['[X]', '[ ]']] 
>>>> [['[ ]', '[ ]'], ['[X]', '[ ]']] <<<< This is what I expect to see 
[1] 

placing: 0 
col: 0 
row: 0 
[X] 
[['[X]', '[ ]'], ['[X]', '[ ]']] 
>>>> [['[X]', '[ ]'], ['[X]', '[ ]']] <<<< This is what I expect to see 
[1, 0] 

placing: 3 
col: 1 
row: 1 
[X] 
[['[X]', '[X]'], ['[X]', '[X]']] 
>>>> [['[X]', '[ ]'], ['[X]', '[X]']] <<<< This is what I expect to see 
[1, 0, 3] 

placing: 2 
col: 0 
row: 1 
[X] 
[['[X]', '[X]'], ['[X]', '[X]']] 
>>>> [['[X]', '[X]'], ['[X]', '[X]']] <<<< This is what I expect to see 
[1, 0, 3, 2] 

私は上記の出力で「>>>>」で始まる行を見ることを期待するものを示しているが。

Q:私のコード内で、何が間違っていますか?

答えて

2

あなたのコードは正しいと思いますが、コードに表示されない何かが間違っている可能性があります。

board = [[""]*board_size] * board_sizeの初期化を表示していません。私はboard = [[""]*board_size] * board_sizeを試してみましたが、あなたが示したのと同じ出力が得られます。この場合、ボードは実際にあなたの "リストのリスト"ではなく、それは1つのリストであり、 "board_size"の時間繰り返されるので、リストの1つを変更すると、それらのすべてを変更します。

ボード初期化をboard = [[""]*board_size for i in range(board_size)]に変更してから、正しい答えが得られます。あなたは、リスト内のリストは同じリストかそうでないかどうかを確認するために、このコードを使用することができます

import random 
board_size = 2 
number_of_squares_on_board = board_size * board_size 

# good list: 
board = [[""]*board_size for i in range(board_size)] 
# wrong list: 
board = [[""]*board_size] * board_size 
# check if they were the same 
for _list in board: 
    print(id(_list)) 

computers_places = [] 

while len(computers_places) < number_of_squares_on_board: 

    placing = random.randint(0, number_of_squares_on_board-1) 

    if placing not in computers_places: 
     computers_places.append(placing) 
     row = int(placing/board_size) 
     column = int(placing % board_size) 
     # print(computers_places) 
     print("\nplacing: ", placing) 
     print("col: ", column) 
     print("row: ", row) 

     column_list = board[column] 
     column_list[row] = "[X]" 

     print(board[column][row]) 
     print(board) 
     print(computers_places) 
+2

さらに読書のために、この種のエラーは、_The Python標準Library_、[4.6.1に記載されています。共通シーケンス操作](https://docs.python.org/3/library/stdtypes.html#typesseq-common)、注2、 's * n'スタイルのシーケンス乗算について:"シーケンス内のアイテム ' sはコピーされず、複数回参照されます。これはしばしば、新しいPythonプログラマに悩まされます... " –

+0

リストの初期化が間違っていました。 – 3kstc

関連する問題