如何撤消对C ++类Python实例的Python 2D数组所做的更改

时间:2017-08-28 22:49:34

标签: python c++ arrays

bool backtrack(int k)
{
    if (k >= bt.size())
        return true;
    int i = bt[k].first;
    int j = bt[k].second;
    // fast path - only 1 possibility
    if (cells[i][j].value)
        return backtrack(k + 1);
    auto constraints = cells[i][j].constraints;
    // slow path >1 possibility.
    // making snapshot of the state
    array<array<cell,9>,9> snapshot(cells);
    for (int v = 1; v <= 9; v++) {
        if (!constraints[v]) {
            if (set(i, j, v)) {
                if (backtrack(k + 1))
                    return true;
            }
            // restoring from snapshot,
            cells = snapshot;
        }
    }
    return false;
}

我如何在Python中完成同样的事情?现在我有这个,但它不起作用。我正在进行深层复制,但仍然没有给出相同的答案。 这里的单元格是Cell实例的2D数组

def backtrack(self, k, bt, cells):
    if k == len(bt):
        return True      
    i = bt[k][0]
    j = bt[k][1]
    if cells[i][j].value:
        return self.backtrack(k+1, bt, cells)
    constraints = list(cells[i][j].constraints)
    deepcop = copy.deepcopy(cells)
    for v in range(1, 10):        
        if not constraints[v]:
            if self.set(i, j, v, cells):
                if self.backtrack(k + 1, bt, cells):
                    return True
            cells = deepcop
    return False

编辑:我添加了完整的功能。 C ++使用全局变量,而我在Python中传递参数。 bt是C ++中对对象的数组,它是Python中的元组数组。

1 个答案:

答案 0 :(得分:0)

这两个程序并不相同。在C ++版本中,这一行:

cells = snapshot;

全局变量cells标识的对象替换为局部变量snapshot标识的对象。

在Python版本中,这一行:

cells = deepcop

local 变量cells标识的对象替换为本地变量deepcop标识的对象。

两种语言在处理函数参数方面非常相似。函数参数仅在函数体内作用域,并且任何函数都不能使调用范围中的对象被替换为另一个。 (当参数是具有内部状态的对象时,该状态当然可以在函数体内更改。)

由于您正在使用Python类中定义的函数(使用self变量),因此请考虑将cells作为成员变量。