这不是我的全部代码。这只是展示了我想做的事情。我想要的是列表" board"保持不变并列入清单" new"改变。我对该程序的问题是列表" 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.
.....
.....
查看新的和新的列表是如何相同的。那是为什么?
答案 0 :(得分:2)
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]]