2016-04-27 6 views
1

Я кодировал решение 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 

ответ

2

Ваша интуиция совершенно верна! Проблема заключается в линии

board = empty_board 

В Python, большинство вещей проходят по ссылке, что означает, что эта строка просто объявить переменную board быть указателем на массив empty_board. Когда вы затем измените board позже в своей функции transform, вы на самом деле изменяете свой empty_board!

Что вы хотите, чтобы копиюempty_board в board, который вы можете легко сделать путем добавления import copy в верхней части файла, а затем:

board = copy.deepcopy(empty_board) 

Заметим, что вы должны использовать deepcopy, а не просто копия, так как empty_board представляет собой массив массивов. Если вы просто скопировали его, вы получите новый массив, содержащий те же массивы, и, таким образом, при изменении содержимого вашего нового массива вы также будете изменять содержимое empty_board.

+1

1: «В python большинство вещей передаются по ссылке»: независимо от того, где вы попадаете на соответствующую метку для объектной модели Python (если мне нужно было выбрать фразу, это может быть «передать по эталонному значению»,), говоря «большинство вещей», кажется, что иногда Python ведет себя так, а иногда и в другом. Но Python передает объекты одинаково, каждый раз. Я бы просто разделил фразу «In python, большинство вещей - это перекрестная ссылка». 2: списки, а не массивы. :-) – DSM