在python中混淆变量更新

时间:2015-05-06 00:15:54

标签: python variables sudoku

所以我正在阅读Peter Norvig Solving Every Sudoku Puzzle,同时他说他通过调用函数assign更新了值。如果没有对变量值进行赋值,我无法理解函数赋值如何更新变量。值是通过引用assign函数传递的。

以下是相关代码:

def parse_grid(grid):
"""Convert grid to a dict of possible values, {square: digits}, or
return False if a contradiction is detected."""
## To start, every square can be any digit; then assign values from the 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.)

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

谢谢!

1 个答案:

答案 0 :(得分:0)

assign()通过探索其后果来执行将数字分配给一个正方形:消除替代答案。所有修改都在eliminate()中完成,您不会将其包含在您的代码段中。第一步(在检查是否需要做任何事情之后)是从位置d消除值s

def eliminate(values, s, d):
    """Eliminate d from values[s]; propagate when values or places <= 2.
    Return values, except return False if a contradiction is detected."""
    if d not in values[s]:
        return values ## Already eliminated
    values[s] = values[s].replace(d,'')
    ... 

您正在寻找的任务。对d2移交给assign()的每个eliminate()执行此操作。 (然后eliminate()以递归方式调用自身,以删除更多值)。因此,没有批发替代字典,但其内容逐一修改。

参数在python中通过引用传递,因此所有这些调用都操纵相同的字典。新词典仅在search()中创建,并显式调用values.copy()assign()eliminate()都会返回对它们所给出的相同字典对象的引用(当然,除非它们返回False)。事实上,据我所知,eliminate()也可能返回True/False,因为它的返回值只能以布尔方式检查;调用者已经可以访问传入的字典。