Python;不同的结果取决于我是否在参数中放入变量或直接放入值



我有一个函数创建一个矩阵,另一个函数更改矩阵中的值。如果我使用第一个函数中创建的矩阵作为第二个函数的参数,我会得到与直接写入矩阵不同的结果。

代码:

test = createBoard(2,2)               #the parameters are the dimensions
print(type(test))
print(test)
setBoardXY(test, 1, 0, 2)                # (matrix,x,y,value to change)
setBoardXY([[0,0],[0,0]],1,0,2)

输出:

<class 'list'>
[[0, 0], [0, 0]]
[[0, 2], [0, 2]]
[[0, 2], [0, 0]]

''

正如您在参数中看到的,对于相同的矩阵,结果是不一样的。

如果你想看到的功能

def setBoardXY(board, x, y, value):
for line in board:
if x >= len(line) or x < 0 or y >= len(board) or y < 0:
print(board)
return board
else:
board[y][x] = value
print(board)
return board

我真的不明白为什么同一个函数有同样的参数却没有同样的结果。提前感谢

EDIT:很明显,它可能来自函数createBoard,所有行都被引用。

def createBoard(DIMX, DIMY):
matrix = []
X = []
i = 0
while i != DIMX :
X.append(0)
i+=1
while len(matrix) != DIMY :
matrix.append(X)
return matrix

使用列表的副本,以便获得一个单独的对象。

def createBoard(DIMX, DIMY):
matrix = []
X = []
i = 0
while i != DIMX :
X.append(0)
i+=1
while len(matrix) != DIMY :
matrix.append(X.copy())
return matrix

您在setBoardXY中更改的列表不是新列表。它只是对您使用createBoard创建的列表的引用。你可以用下面的函数来解决你的问题。它创建了一个新的列表board,然后可以安全地进行突变,而不会产生任何不必要的副作用。

def setBoardXY(old_board, x, y, value):
board = [d[:] for d in old_board]
for line in board:
if x >= len(line) or x < 0 or y >= len(board) or y < 0:
print(board)
return board
else:
board[y][x] = value
print(board)
return board

一般来说,Python名称只是引用。唯一的例外是整数、浮点、字符串和元组。它们不会发生突变(因此,如果您使用重新分配它们的表达式,它将创建一个新对象。(

最新更新