Python:这个变量值为什么会变化?
Python: why does this variable value change?
我正在学习递归并完成了这段代码(不是我的:https://github.com/kying18/sudoku)并且无法弄清楚为什么变量 example_board 会更改值。它再也不会被寻址并且没有其他变量链接到它?我测试了一下,确实如此!
这里是相关代码的精简版:
def find_next_empty(puzzle):
#returns a row, col for a empty square
def is_valid(puzzle, guess, row, col):
#checks if guess is True or False
def solve_sudoku(puzzle):
row, col = find_next_empty(puzzle)
if row is None: # this is true if our find_next_empty function returns None, None
return True
for guess in range(1, 10): # range(1, 10) is 1, 2, 3, ... 9
if is_valid(puzzle, guess, row, col):
puzzle[row][col] = guess
if solve_sudoku(puzzle):
return True
puzzle[row][col] = -1
return False
if __name__ == '__main__':
example_board = [
[3, 9, -1, -1, 5, -1, -1, -1, -1],
[-1, -1, -1, 2, -1, -1, -1, -1, 5],
[-1, -1, -1, 7, 1, 9, -1, 8, -1],
[-1, 5, -1, -1, 6, 8, -1, -1, -1],
[2, -1, 6, -1, -1, 3, -1, -1, -1],
[-1, -1, -1, -1, -1, -1, -1, -1, 4],
[5, -1, -1, -1, -1, -1, -1, -1, -1],
[6, 7, -1, 1, -1, 5, -1, 4, -1],
[1, -1, 9, -1, -1, -1, 2, -1, -1]
]
print(solve_sudoku(example_board))
print(example_board)
'''
在行中打印时:“print(solve_sudoku(example_board))”example_board 被传递到 solve_sodoku。 solve_sodoku 函数然后在这一行中更改它的值:“puzzle[row][col] = guess”,因为 puzzle 引用 example_board 变量并且它的值之一被更改为 guess。
希望对您有所帮助!
在深入了解实现细节之前,您必须了解按引用或按值传递参数的含义,因为 python 按引用传递:
传递意味着向函数提供参数。
通过引用意味着您传递给函数的参数是对内存中已存在的变量的引用,而不是该变量的独立副本。
由于您为函数提供了对现有变量的引用,因此对该引用执行的所有操作都将直接影响它所引用的变量。让我们看一些例子,看看它在实践中是如何工作的。
我正在学习递归并完成了这段代码(不是我的:https://github.com/kying18/sudoku)并且无法弄清楚为什么变量 example_board 会更改值。它再也不会被寻址并且没有其他变量链接到它?我测试了一下,确实如此!
这里是相关代码的精简版:
def find_next_empty(puzzle):
#returns a row, col for a empty square
def is_valid(puzzle, guess, row, col):
#checks if guess is True or False
def solve_sudoku(puzzle):
row, col = find_next_empty(puzzle)
if row is None: # this is true if our find_next_empty function returns None, None
return True
for guess in range(1, 10): # range(1, 10) is 1, 2, 3, ... 9
if is_valid(puzzle, guess, row, col):
puzzle[row][col] = guess
if solve_sudoku(puzzle):
return True
puzzle[row][col] = -1
return False
if __name__ == '__main__':
example_board = [
[3, 9, -1, -1, 5, -1, -1, -1, -1],
[-1, -1, -1, 2, -1, -1, -1, -1, 5],
[-1, -1, -1, 7, 1, 9, -1, 8, -1],
[-1, 5, -1, -1, 6, 8, -1, -1, -1],
[2, -1, 6, -1, -1, 3, -1, -1, -1],
[-1, -1, -1, -1, -1, -1, -1, -1, 4],
[5, -1, -1, -1, -1, -1, -1, -1, -1],
[6, 7, -1, 1, -1, 5, -1, 4, -1],
[1, -1, 9, -1, -1, -1, 2, -1, -1]
]
print(solve_sudoku(example_board))
print(example_board)
'''
在行中打印时:“print(solve_sudoku(example_board))”example_board 被传递到 solve_sodoku。 solve_sodoku 函数然后在这一行中更改它的值:“puzzle[row][col] = guess”,因为 puzzle 引用 example_board 变量并且它的值之一被更改为 guess。
希望对您有所帮助!
在深入了解实现细节之前,您必须了解按引用或按值传递参数的含义,因为 python 按引用传递:
传递意味着向函数提供参数。 通过引用意味着您传递给函数的参数是对内存中已存在的变量的引用,而不是该变量的独立副本。
由于您为函数提供了对现有变量的引用,因此对该引用执行的所有操作都将直接影响它所引用的变量。让我们看一些例子,看看它在实践中是如何工作的。