неправильная оценка списка при добавлении значения Начинается - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь определить причину, по которой два идентичных списка возвращают разные значения при назначении нового значения. При условии, что у меня есть список, a, когда я утверждаю, что значение a равно переменной класса, matrix, я возвращаю true. Когда я изменяю значение первого элемента в каждом списке a и matrix, списки больше не равны. Как насчет манипулирования списком matrix приводит к результату, отличному от ожидаемого?

class Matrix():
    def __init__(self, cells):
        self.cells: int = cells
        self.block: list = [] 
        self.matrix: list = []
        self.empty_block()
        self.create_matrix()

    # empty block
    def empty_block(self):
        self.block = [list(None for row in range(self.cells)) for col in range(self.cells)]

    # matrix of blocks
    def create_matrix(self):
        self.matrix = [list(self.block for row in range(self.cells)) for col in range(self.cells)]

    def insert(self, row, block, sub_column, sub_row, value):
        a = [[[[None, None], [None, None]], [[None, None], [None, None]]], [[[None, None], [None, None]], [[None, None], [None, None]]]]
        print(self.matrix == a)
        a[row][block][sub_column][sub_row] = value
        self.matrix[row][block][sub_column][sub_row] = value
        print(self.matrix == a)
        print(f"a: {a}")
        print(f"b: {self.matrix}")

from matrix import Matrix
matrix = Matrix(2)
matrix.insert(0,0,0,0,1)

Результат:

True
False
a: [[[[1, None], [None, None]], [[None, None], [None, None]]], [[[None, None], [None, None]], [[None, None], [None, None]]]]
b: [[[[1, None], [None, None]], [[1, None], [None, None]]], [[[1, None], [None, None]], [[1, None], [None, None]]]]

Ожидаемый результат:

Результат:

True
True
a: [[[[1, None], [None, None]], [[None, None], [None, None]]], [[[None, None], [None, None]], [[None, None], [None, None]]]]
b: [[[[1, None], [None, None]], [[None, None], [None, None]]], [[[None, None], [None, None]], [[None, None], [None, None]]]]

1 Ответ

0 голосов
/ 05 ноября 2018

Это несколько запутанная версия гораздо более распространенная ошибка индексации списка . В вашем случае это немного неуловимо, потому что вы создаете внутренний массив в одном месте и дублируете его в другом. Список, который копируется, - self.block, он создается в self.empty_block() и дублируется в self.matrix при вызове self.create_matrix(). Я отсылаю вас к этому другому вопросу, чтобы понять, почему это приводит к результатам, которые вы видите, но решение в основном заключается в том, что вам нужно создать новый «блок» для каждой строки в матрице или создать копии этого блока для каждый ряд. Если вы просто создаете матрицу, составляя список из группы одного и того же блока, то у вас действительно есть только два массива, матрица и один блок, на который многократно указывается матрица. У вас должно работать что-то вроде следующего:

# empty block
def create_empty_block(self):
    return [list(None for row in range(self.cells)) for col in range(self.cells)]

# matrix of blocks
def create_matrix(self):
    self.matrix = [list(self.create_empty_block() for row in range(self.cells)) for col in range(self.cells)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...