首页 > 解决方案 > 当'按值传递'似乎仍然改变递归函数内的原始对象时

问题描述

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

fillTheBoardLCanFit是一个在某些条件( )匹配时调用自身的函数。有很多ifs,为了让它正常工作,最初传递的参数board不应该在相同的深度上改变if。唯一可以改变的函数board是,paintPointsBlack但为了避免这种情况,我传递了副本(board[:]),并且在一次更加谨慎但毫无意义的尝试中,我将其复制到paintPointsBlack.

我遇到的问题是,board在一个递归分支完成并移动到下一个分支(next if)之后仍然会发生变化。所以board内部if LCanFit['RdD'] == 1board内部if LCanFit['DL'] == 1(相同的深度)是不一样的,因为board更改为newBoard最后调用的函数(最深,因为它可以与前一个一起使用if)。

我知道按值传递无法改变原始值,但我仍然看到它发生了变化board,这太令人困惑了。如果我更好地重写代码,我应该如何构造它?

标签: python

解决方案


推荐阅读