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

ただし、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を返すことはできませんか?

値を返しても元の変数については何も変わらないことを理解しました。変数がパラメーターとして渡され、別の変数にリバウンドせずにそこで変更された場合にのみ、同じ参照を保持しているため、「元の」変数が変更されます。

ただし、return valuesin def parse_grid(grid)は、関数の開始時の値よりも完全に変更された値である必要があります。これはいつ割り当てられますか?

質問:

)のどこが変更valuesdef parse_grid(gridれますか?この関数は値を返すため、この戻り値はこの関数の開始時に設定された値と同じであってはなりません。では、どこでどのように変更されたのでしょうか。

たとえば、次のように呼び出されます。display(parse_grid(grid2))

4

3 に答える 3

2

割り当て関数は複数回呼び出されます。たとえば、検索機能では次のようになります。

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の戻り値が検索に渡されます。

于 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を返すことはトリックをするでしょう。

しかし、割り当てはより多くのことができるので、なぜそれを不自由にするのですか?コードの他の場所で役立つ場合があります。


編集:そしてそれは実際にそうです。リンクされたコードを見ると、関数searchはそれを呼び出し、戻り値を使用します。

于 2013-03-16T21:55:51.040 に答える