复制列表错误Python(康威生活游戏的一部分)

2024-09-29 22:36:29 发布

您现在位置:Python中文网/ 问答频道 /正文

这不是我的全部密码。这就是我想做的。我想要的是列表“board”保持不变,列表“new”改变。我对这个程序的问题是,列表“新”的变化以及董事会。你知道吗

DEADCELL = "."
LIVECELL = "A"
rows = 5
columns = 5

def startingBoard():
    cellRow = ""
    cellCol = 1
    board = []
    for i in range(rows):
        board.append([DEADCELL]* columns)
    while cellRow != "q":
        cellRow = input("Please enter the row of a cell to turn on (or q to exit): ")  
        if cellRow != "q":
            cellCol = int(input("Please enter a column for that cell: "))
            board[int(cellRow)][cellCol] = LIVECELL
    return board

def printBoard(board):
    for i in range(rows):
        printRow = ""
        for j in range(columns):
            if board[i][j] == LIVECELL:
                printRow = printRow + LIVECELL
            elif board[i][j] == DEADCELL:
                printRow = printRow + DEADCELL
        print(printRow)
    print("\n")

def neighbors(board):
    new = list(board)
    for r in range(rows):
        for c in range(columns):
            neighbors = 0
            # ALL THIS SECTION DOES IS CHECK THE 'NEIGHBORS' AROUND A CELL
            if r - 1 >= 0 and c - 1 >= 0:
                if board[r - 1][c - 1] == LIVECELL:
                    neighbors += 1
            if c - 1 >= 0:
                if board[r][c-1] == LIVECELL:
                    neighbors += 1
            if r + 1 < rows and c + 1 < rows:
                if board[r + 1][c + 1] == LIVECELL:
                    neighbors += 1
            if r - 1 >= 0:
                if board[r - 1][c] == LIVECELL:
                    neighbors += 1
            if r + 1 < rows:  
                if board[r + 1][c] == LIVECELL:
                    neighbors += 1
            if r - 1 >=0 and c + 1 < rows:
                if board[r-1][c+1] == LIVECELL:
                    neighbors += 1
            if c + 1 < rows:
                if board[r][c+1] == LIVECELL:
                    neighbors += 1
            if r + 1 < rows and c - 1 >= 0:
                if board[r+1][c-1] == LIVECELL:
                    neighbors += 1

            # RULES FOR CELLS:
            # IF A LIVE CELL HAS TWO OR THREE NEIGHBORS, IT STAYS ALIVE
            # IF A LIVE CELL HAS LESS THAN TWO NEIGHBORS, IT DIES
            # IF A LIVE CELL HAS MORE THAN THREE NEIGHBORS, IT DIES
            # IF A DEAD CELL HAS THREE NEIGHBORS, IT BECOMES ALIVE
            if board[r][c] == DEADCELL and neighbors == 3:
                new[r][c] = LIVECELL
            elif board[r][c] == LIVECELL and (neighbors < 2 or neighbors > 3):
                new[r][c] = DEADCELL
    #This prints out the new list and the board list to show you guys how they are the same.
    print(new)
    print(board)

def main():
    board = startingBoard()
    printBoard(board)
    neighbors(board)
    printBoard(board)
main()

以下是我的输出:

Please enter the row of a cell to turn on (or q to exit): 2
Please enter a column for that cell: 1
Please enter the row of a cell to turn on (or q to exit): 2
Please enter a column for that cell: 2
Please enter the row of a cell to turn on (or q to exit): 2
Please enter a column for that cell: 3
Please enter the row of a cell to turn on (or q to exit): q
.....
.....
.AAA.
.....
.....


[['.', '.', '.', '.', '.'], ['.', '.', 'A', 'A', '.'], ['.', 'A', '.', 'A', '.'], ['.', '.', '.', '.', '.'], ['.', '.', '.', '.', '.']]
[['.', '.', '.', '.', '.'], ['.', '.', 'A', 'A', '.'], ['.', 'A', '.', 'A', '.'], ['.', '.', '.', '.', '.'], ['.', '.', '.', '.', '.']]
.....
..AA.
.A.A.
.....
.....

看看新名单和董事会是如何相同的。为什么?你知道吗


Tags: orandthetoboardnewforif
1条回答
网友
1楼 · 发布于 2024-09-29 22:36:29

new = list(board)是浅层复制:它不会克隆子元素,只会复制引用。你知道吗

a = [[True]]
b = list(a)
b[0][0] = False
a
# => [[False]]

你需要深度复制:

a = [[True]]
from copy import deepcopy
b = deepcopy(a)
b[0][0] = False
a
# => [[True]]

相关问题 更多 >

    热门问题