python - 更改 2D Char 列表中的元素
问题描述
我想访问和更改我的 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()
解决方案
这个:
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()
:
# 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]
推荐阅读
- git - git fetch 只进入指定的目标分支
- kotlin - RxJava UndeliverableException如何处理onSuccess消费者异常?
- join - Snowsql 加入或强制转换问题
- javascript - 在反应js中隐藏和显示元素(按列排序)
- python - 使用 Pandas 的列中相似外观数据的平均值
- swift - SwiftUI 在父视图中更新源时如何防止 NavigationLink 弹出?
- excel - 自动将 Excel 中的值填充到 Confluence 时间线中
- c - OpenMP 的 VSCode 自动完成功能
- google-chrome - 如何在不属于您的站点上的浏览器中处理 WebSocket?
- oracle - Oracle Text - 索引文档,其中每个文档都有多种语言突变