Найти - Пользователи
Полная версия: Копирование списков
Начало » Python для новичков » Копирование списков
1
evg90
Всем доброй ночи.
Возникла такая проблемка: есть некий список (дерево) классов. В классах основным атрибутом является матрица 8*8, отвечающая за расстановку фигур на шахматной доске. Нужно расставить фигуры так, чтобы они не угрожали друг другу. Решаю пока что самым примитивным перебором всех вариантов.

class Board:
def __init__(self, board = None):
if not board:
self.board = [[0 for i in range(8)] for j in range(8)]
else:
self.board = copy.copy(board)

class PossibleBoard(Board):
def __init__(self, level, free_cells, parent, brd=None):
Board.__init__(self, board = brd)
self.level = level
self.free_cells = free_cells
self.parent = parent

class Work:
def __init__(self, figures):
self.figures = figures
self.board = PossibleBoard(0, 64, None)
self.result = [list() for i in range(len(self.figures)+1)]
self.result[0].append(self.board)

...

def set_queen(self, brd):
for x in range(8):
for y in range(8):
if not (brd.board)[x][y]:
tmp_board = PossibleBoard(self.level,
brd.free_cells-1,
copy.copy(brd),
copy.copy(brd.board))
(tmp_board.board)[x][y] = 'Q'
for i in range(8):
for j in range(8):
if (i==x or j==y or (abs(x-i)==abs(y-j)) ) and tmp_board.board[i][j]==0:
tmp_board.board[i][j] = 1
tmp_board.free_cells-=1

self.result[self.level].append(tmp_board)
И все бы хорошо, да только в итоге все экземпляры PossibleBoard указывают на один и тот же массив board, и изменяют его же. Что спрашивать в данном случае у google - не знаю, так что обращаюсь к Вам за помощью :)

P.S. готов также выслушать комментарии по оптимизации данных кусков кода.
fanatid
Для вложенных списков необходимо использовать deepcopy
>>> import copy
>>> a = [[],[],[]]
>>> b = copy.copy(a)
>>> c = copy.deepcopy(a)
>>> print id(a), [id(a[i]) for i in xrange(3)]
3073918252 [3073918124L, 3073918092L, 3073918284L]
>>> print id(b), [id(b[i]) for i in xrange(3)]
3073931276 [3073918124L, 3073918092L, 3073918284L]
>>> print id(c), [id(c[i]) for i in xrange(3)]
3073931180 [3073919372L, 3073931244L, 3073931340L]
evg90
Спасибо, помогло.
pyhappy
Подскажите почему не работает deepcopy
import copy
rows=2 # число строк в исходной матрице (будет потом расчетное)
columns=3 # число столбцов в исходной матрице (будет потом расчетное)
z=None

matr_rev = [[z]*rows]*columns # готовим матрицу из элементов None
print(matr_rev)

matr_rev2= copy.deepcopy(matr_rev) #глубокая копия
matr_rev2[0][1]=2 #вставка 1 элемента
print(matr_rev2)
[, , ]
[, , ]
py.user.next
pyhappy
Подскажите почему не работает deepcopy
она работает, просто первый список неправильно создаётся
pyhappy
py.user.next
pyhappy
Подскажите почему не работает deepcopy
она работает, просто первый список неправильно создаётся
а подскажите как правильно создать пустую матрицу переменных размеров (те размеры являются вычисляемыми значениями)
py.user.next
>>> rows, cols = 2, 3
>>> matr = [[None for j in range(cols)] for i in range(rows)]
>>> matr[0]
[None, None, None]
>>> matr
[[None, None, None], [None, None, None]]
>>>
pyhappy
py.user.next
>>> rows, cols = 2, 3
>>> matr = [[None for j in range(cols)] for i in range(rows)]
>>> matr[0]
[None, None, None]
>>> matr
[[None, None, None], [None, None, None]]
>>>
То что нужно. Спасибо!!
minotavr_x86
rows, cols = 2, 3
a = map(list,[*cols]*rows)
py.user.next
>>> x, y, z = 2, 3, 4
>>> matr = [[[None for k in range(z)] for j in range(y)] for i in range(x)]
>>> matr[0][0][0] = 1
>>> matr
[[[1, None, None, None], [None, None, None, None], [None, None, None, None]], [[None, None, None, None], [None, None, None, None], [None, None, None, None]]]
>>>
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB