私は他の質問で説明されている記事全体を読んで理解しています。
私の問題はこのソースコードに関するものです。
作成者は関数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 values
in def parse_grid(grid
)は、関数の開始時の値よりも完全に変更された値である必要があります。これはいつ割り当てられますか?
質問:
)のどこが変更values
さdef parse_grid(grid
れますか?この関数は値を返すため、この戻り値はこの関数の開始時に設定された値と同じであってはなりません。では、どこでどのように変更されたのでしょうか。
たとえば、次のように呼び出されます。display(parse_grid(grid2))