有条件的行为不符合预期

  • 本文关键字:不符合 有条件 python
  • 更新时间 :
  • 英文 :


我是一名经验丰富的程序员,但不熟悉Python。附加的代码是我在设置一个游戏板网格的尝试。我想用0填充网格的顶部,用1填充网格的底部。然而,这段代码总是用1填满整个棋盘。我怀疑我犯了初学者的错误,只是没有意识到。我认为下面是一个最小可复制的例子。

ROWS = 56 
COLS = 79
#put the cursor at position x,y on screen
def gotoxy(x,y):
print ("%c[%d;%df" % (0x1B, y, x), end='')
# class for objects that populate the grid
class cell:
Xloc = 0; Yloc = 0
contents = 0
# 2-dim array of cells - here just for convenience
emptyBoard = [[cell for i in range(ROWS)] for k in range(COLS)]
# class for the board
class board:
# cell field: Xloc & Yloc & contents of each cell
cells = emptyBoard  
# function: write the board to the screen
def dispBoard(self):
for x in range(0,COLS):
for y in range(0, ROWS):
gotoxy(x,y)
print (str(self.cells[x][y].contents)) 
# function: fill the cells with 0s or 1s 
def fillBoard(self):
for x in range(0,COLS):
for y in range(0, ROWS):
self.cells[x][y].Xloc = x
self.cells[x][y].Yloc = y
if y > 20:
self.cells[x][y].contents = 1
else:
self.cells[x][y].contents = 0  
def main():    
bord = board()
bord.fillBoard()
bord.dispBoard()
if __name__ == "__main__":
main()

当您创建emptyBoard时,您并没有为每个cell创建一个新对象(参见缺少的括号?)

emptyBoard = [[cell for i in range(ROWS)] for k in range(COLS)]

所以所有的cell都是指基本的cell类,即使你改变了一个单元格的内容,它也会改变所有的cell

现在要解决这个问题,只需添加括号,它将为每个cell创建一个新对象,其属性将独立于其他cell

emptyBoard = [[cell() for i in range(ROWS)] for k in range(COLS)]

除了kinshukdua的答案之外,您还缺少__init__方法(至少在cell类中需要它)。

class cell:
def __init__(self):
self.Xloc = 0
self.Yloc = 0
self.contents = 0

否则Xloc,Yloccontent是类属性,它们由类的所有实例共享,因此毫无疑问,棋盘上的所有元素都具有相同的值。

顺便说一下,如果你想有一个更面向对象的风格,最好将emptyBoard = [[cell() for i in range(ROWS)] for k in range(COLS)]移动到board类的__init__方法中。像这样:

class board:
def __init__(self):
# cell field: Xloc & Yloc & contents of each cell
sellf.cells = [[cell() for i in range(ROWS)] for k in range(COLS)]

最新更新