如何复制变量的内容?

时间:2016-04-27 23:45:55

标签: python

我编写了一个Sudoku解算器,并在适当的Sudoku板中转换字符串时遇到了问题。

示例输入是“2.3.8 .... 8..7 ........... 1 ... 6.5.7 ...... 4 ...... 3 .. ..1 ............ 82.5 .... 6 ... 1 ......” 告诉用户什么数字应该放入数独板的正方形。 '。'或者'0'代表一个空白,我用列表[1,2,...,8,9]填充列表中的位置。这是通过转换功能完成的。它是在第一次调用函数时正确完成的,但是第二次和第三次都是错误地完成(看起来新板存储了前一个板的一些信息)。

在这个编码示例中,第二个打印功能打印不正确,在前两个8之间,我打印的列表中有一个不应该存在的6个,并且我相信它来自之前的转换调用“easy_board”。

请看一下。感谢。

print "Welcome to 9X9 Sudoku in Python"
SIZE = 81
LENGTH = 9

empty_board = [[i for i in xrange(1, LENGTH + 1)] for j in xrange(0, SIZE)]

def transform(input):
    if len(input) != SIZE:
        print "Input length [%d] is not of the correct size [%d]." % len(input), SIZE
        return
    board = empty_board
    for i in xrange(SIZE):
        if input[i] != '0' and input[i] != '.':
            board[i] = [int(input[i])]
    return board

easy_board = "003020600900305001001806400008102900700000008006708200002609500800203009005010300"
medium_board = "2.3.8....8..7...........1...6.5.7...4......3....1............82.5....6...1......."
hard_board = ".6.5.4.3.1...9...8.........9...5...6.4.6.2.7.7...4...5.........4...8...1.5.2.3.4."

print "\ndoing ez board"
our_board = transform(easy_board)
print our_board

print "\ndoing medium board"
our_board = transform(medium_board)
print our_board

print "\ndoing hard board"
our_board = transform(hard_board)
print our_board

1 个答案:

答案 0 :(得分:2)

你的直觉是完全正确的!问题在于

board = empty_board

在python中,大多数东西都是pass-by-reference,这意味着这一行只是声明变量board是一个指向数组empty_board的指针。如果您稍后在board函数中修改transform,则实际上是在修改empty_board

您想要的是复制 empty_boardboard,您可以通过在文件顶部添加import copy轻松完成,然后:

board = copy.deepcopy(empty_board)

请注意,您必须使用deepcopy而不是仅复制,因为empty_board是数组数组。如果您刚刚复制它,您将获得一个包含相同数组的新数组,因此当您修改新数组的内容时,您还将修改empty_board的内容