Python | 返回变量

0 投票
3 回答
6447 浏览
提问于 2025-04-17 19:21

我读懂了在另一个问题中提到的整篇文章。

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

作者在函数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

但是assign这个函数从来没有被用来设置调用函数parse_grid(grid)中的现有变量值:

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不就行了吗?

我明白了,返回一个值并不会改变原始变量的内容。只有当这个变量作为参数传入并在那儿被修改,而没有被重新绑定到另一个变量时,原始变量才会改变,因为它们指向的是同一个引用。

不过在def parse_grid(grid中,return values应该是与函数开始时的值完全不同的。那么这个值是在哪里被赋值的呢?

问题:

def parse_grid(grid中,values是在哪里被改变的?因为这个函数返回的值不应该与函数开始时设置的值相同。那么它是在哪里被改变的,怎么改变的呢?

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

3 个回答

1

在你展示的代码中,assign这个功能似乎用得不太多。你说得对,它只是用来检查值的有效性(也就是确认没有矛盾)。所以,像你说的,返回true就可以解决问题。

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


补充一下:实际上,它确实是有用的。看一下链接的代码,函数search调用了它,并且使用了返回的值。

2

assign这个函数会被调用很多次。比如在search这个函数里:

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,以便继续进行深度优先搜索。

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,因为调用者想要获取并使用这个新的 dict

撰写回答