Изменение элемента в списке двумерных символов - PullRequest
0 голосов
/ 09 декабря 2018

Я хотел бы получить доступ и изменить один символ в моем 2D-списке символов.Однако, когда я меняю один, он меняет весь столбец.Почему это?Что я делаю неправильно?В строке 31: я изменяю элемент в моем массиве и получаю результат, отличный от того, который я хочу и ожидаю.

Ниже мой код:

from random import *

class chessBoard:

    BOARD       = None
    BOARD_WIDTH = 8

    def __init__(self,W = 8):
       self.BOARD = []
       self.BOARD_WIDTH = W

       aRow = ['.'] * self.BOARD_WIDTH
       for curRow in range(self.BOARD_WIDTH):
           self.BOARD.append(aRow)


    def printBoard(self):
       for curRow in self.BOARD:
          print(curRow)


    def initialiseRandomQ(self,N):

       cords = []
       for ii in range(self.BOARD_WIDTH):
          for jj in range(self.BOARD_WIDTH):
              cords.append( [ii,jj] )

       shuffle(cords)

       self.BOARD[0][0] = '1'

       # for curQ in range(N):
       #     xx = cords[curQ][0]
       #     yy = cords[curQ][1]

       #     print(xx,yy)
       #     print(cords[curQ]) 

       #     self.BOARD[xx][yy] = 'Q'

#PROGRAM START#

N_QUEENS    = 2

myChessBoard = chessBoard()

myChessBoard.initialiseRandomQ(2)

myChessBoard.printBoard()

1 Ответ

0 голосов
/ 09 декабря 2018

Это:

class chessBoard:

    BOARD       = None
    BOARD_WIDTH = 8

    def __init__(self,W = 8):
       self.BOARD = []
       self.BOARD_WIDTH = W

       aRow = ['.'] * self.BOARD_WIDTH      # this is one list, it's a reference to data
       for curRow in range(self.BOARD_WIDTH):
           self.BOARD.append(aRow)          # adds the same reference 8 times

Ваш список содержит одну и ту же ссылку 8 раз. Если вы меняете данные с помощью одной ссылки, другие (которые совпадают) также отражают это.Все ссылки указывают на одни и те же данные.

Использование

           self.BOARD.append(['.'] * self.BOARD_WIDTH) # add "unique" lists instead

Вы можете проверить id() s:

# your version ( self.BOARD.append(aRow) )
print(list(map(id,myChessBoard.BOARD))) 

[140415825494600, 140415825494600, 140415825494600, 140415825494600,
 140415825494600, 140415825494600, 140415825494600, 140415825494600]

# fixed version (self.BOARD.append(['.'] * self.BOARD_WIDTH))
[140560309994568, 140560309994440, 140560309994376, 140560309994312, 
 140560309994248, 140560309994184, 140560309994120, 140560309994696]

См. Для чего используется функция id ()?

...