【问题标题】:Python | returning a variable蟒蛇 |返回一个变量
【发布时间】:2013-03-05 12:07:09
【问题描述】:

我阅读并理解了other question中描述的整篇文章。

我的问题是关于这个source code

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

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

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

问题:

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

例如这样调用:display(parse_grid(grid2))

【问题讨论】:

    标签: python variables return variable-assignment


    【解决方案1】:

    让我们看看这个函数:

    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

    【讨论】:

    • 但它应该返回一个改变的字典。此方法中的值在哪里发生了变化?
    • 它不会返回更改后的字典。它返回一个全新的字典。通过调用dict() 构造函数创建。
    • 那么他是如何用 display(parse_grid(grid2)) 得到一个完全解决的数独的呢?我虽然 values = dict((s, digits) for s in squares) 以数独开头,其中提到了所有正方形的所有可能性。然后他执行了他的assign函数,然后pof,在parse_grid()中,他返回了一个数独被解决的值?!
    • 呃,我不知道。这个问题会演变成解释所有代码吗?
    • 现在,只是那个部分。改变必须发生在那个函数中,不是吗?还可以如何设置值?我不是在问它是如何工作的,只是想了解 parse_grid() 中的 WHERE 值被更改,因此他返回不同的值。抱歉,我的任何不清楚之处,我不擅长解释 >
    【解决方案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继续深度优先搜索。

    【讨论】:

    • 好的,但是 def parse_grid(grid): 中的值在哪里发生了变化?因为他在没有先使用 search() 的情况下对其进行了测试。他得到了一个完全改变的价值观(解决了数独)。
    【解决方案3】:

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

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


    编辑:确实如此。查看链接代码,函数search 调用它并使用返回值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-12
      • 2010-10-27
      相关资源
      最近更新 更多