python - 当'按值传递'似乎仍然改变递归函数内的原始对象时
问题描述
def paintPointsBlack(originalBoard, point0, point1, point2):
board = originalBoard[:]
# do something
return board
def fillTheBoard(board, point):
movePointToWhitePoint(board, point)
if point['row'] == height - 1:
print('last line. terminate')
return
elif point['row'] != height - 1:
LCanFit = canPutLShape(board, point)
if LCanFit['total'] != 0:
point0 = dict(point)
if LCanFit['RdD'] == 1:
...
newBoard = paintPointsBlack(board[:], point, point1, point2)
fillTheBoard(newBoard, point0)
if LCanFit['DL'] == 1:
...
newBoard = paintPointsBlack(board[:], point, point1, point2)
fillTheBoard(newBoard, point0)
if LCanFit['RD'] == 1:
...
newBoard = paintPointsBlack(board[:], point, point1, point2)
fillTheBoard(newBoard, point0)
if LCanFit['DR'] == 1:
...
newBoard = paintPointsBlack(board[:], point, point1, point2)
fillTheBoard(newBoard, point0)
print("inspected everything around : ", point['row'], point['col'])
else:
return
fillTheBoard
LCanFit
是一个在某些条件( )匹配时调用自身的函数。有很多if
s,为了让它正常工作,最初传递的参数board
不应该在相同的深度上改变if
。唯一可以改变的函数board
是,paintPointsBlack
但为了避免这种情况,我传递了副本(board[:]
),并且在一次更加谨慎但毫无意义的尝试中,我将其复制到paintPointsBlack
.
我遇到的问题是,board
在一个递归分支完成并移动到下一个分支(next if
)之后仍然会发生变化。所以board
内部if LCanFit['RdD'] == 1
和board
内部if LCanFit['DL'] == 1
(相同的深度)是不一样的,因为board
更改为newBoard
最后调用的函数(最深,因为它可以与前一个一起使用if
)。
我知道按值传递无法改变原始值,但我仍然看到它发生了变化board
,这太令人困惑了。如果我更好地重写代码,我应该如何构造它?
解决方案
推荐阅读
- node.js - 如果 MongoDB 值超过 20,Discord MongoDB 会给予角色
- jquery - Rails 6 更新使用 Ajax 顺风模式
- javascript - 我在使用调用 js 函数的 onclick 方法获取按钮时遇到问题
- javascript - 我有一个 useReducer 状态,它是一个包含数字数组的对象。当我尝试在减速器中增加其中一个数字时,它会增加 2?
- c++ - 如何在 C++ 中读取文本文件中的姓氏和名字
- javascript - 显示计数器文本,每四拍
- javascript - 无法跨赛普拉斯的步骤共享别名
- python - 如何在按钮按下/按住时停止重复 - Python
- c# - 追踪 EF 呼叫 401 响应的原因
- three.js - 如何将着色器程序材质从 Blender 导出到 Three.js