1

我阅读并理解了其他问题中描述的整篇文章。

我的问题是关于这个源代码

作者在函数assign中返回值:

def assign(values, s, d):
    """Eliminate all the other values (except d) from values[s] and propagate.
    Return values, except return False if a contradiction is detected."""
    other_values = values[s].replace(d, '')
    if all(eliminate(values, s, d2) for d2 in other_values):
        return values
    else:
        return False

但是在调用函数 parse_grid(grid) 时,从不使用 assign 设置现有变量值:

def parse_grid(grid):
    values = dict((s, digits) for s in squares)
    for s,d in grid_values(grid).items():
        if d in digits and not assign(values, s, d):
            return False ## (Fail if we can't assign d to square s.)
    return values

所以返回值对我来说似乎相当不必要。由于他只使用 assign() 作为布尔值,他不能只返回 true 吗?

我知道返回一个值不会改变原始变量的任何内容。只有当变量作为参数传递并在那里更改而不反弹到另一个变量时,“原始”变量才会更改,因为它拥有相同的引用。

但是return valuesin def parse_grid(grid) 应该是一个完全改变的值,然后是函数开头的那个。这个什么时候分配?

问题:

valuesin )在哪里def parse_grid(grid改变?因为这个函数返回值,并且这个返回值不应该和这个函数开始时设置的相同。那么它在哪里改变以及如何改变?

例如,它是这样调用的:display(parse_grid(grid2))

4

3 回答 3

2

多次调用assign函数。例如,在搜索功能中:

def search(values):
    "Using depth-first search and propagation, try all possible values."
    if values is False:
        return False ## Failed earlier
    if all(len(values[s]) == 1 for s in squares): 
        return values ## Solved!
    ## Chose the unfilled square s with the fewest possibilities
    n,s = min((len(values[s]), s) for s in squares if len(values[s]) > 1)
    return some(search(assign(values.copy(), s, d)) 
        for d in values[s])

assign 的返回值被传递给 search 以继续深度优先搜索。

于 2013-03-16T21:54:18.910 回答
2

让我们看一下这个函数:

def parse_grid(grid):
    values = dict((s, digits) for s in squares)
    for s,d in grid_values(grid).items():
        if d in digits and not assign(values, s, d):
            return False ## (Fail if we can't assign d to square s.)
    return values

这里函数返回一个新的dict. 它返回它,以便调用者可以用它做一些事情。该函数不会返回True,因为调用者想要获取并使用该 new dict

于 2013-03-16T21:54:37.613 回答
1

在您显示的代码中,assign 似乎没有得到充分利用。您是对的:它仅用于检查值的有效性(无矛盾测试)。所以,正如你所说,返回 true 就可以了。

但是既然 assign 可以做更多的事情,为什么要削弱它呢?它可能在代码的其他地方有用。


编辑:它实际上是。查看链接代码,函数search调用它并使用返回值。

于 2013-03-16T21:55:51.040 回答