Сравнение списков для игры 2048 - PullRequest
0 голосов
/ 21 марта 2020
def helper(mat):
    for row in mat:
        zero_list = []
        for subrow in row:
            if subrow == 0:
                row.remove(0)
                zero_list.append(0)
        row.extend(zero_list)
    return mat


def merge_left(mat):
    result = mat.copy()
    helper(mat)
    counter = 0 
    for i in range(len(mat)):
        current_tile = 0
        for j in range(len(mat)):
            if mat[i][j] == current_tile:
                mat[i][j-1] *= 2
                mat[i][j] = 0
                counter += mat[i][j-1]
            current_tile = mat[i][j]
    helper(mat)
    return result == mat

print(merge_left([[2, 2, 0, 2], [4, 0, 0, 0], [4, 8, 0, 4], [0, 0, 0, 2]]))

Привет, ребята,

Результат, полученный для merge_left в приведенном выше коде, равен True для контрольного примера. Учитывая, что результат является дубликатом мата. Как получается, что результат также был изменен таким же образом, что и этот код? Я бы понял, что это так, если бы я написал

result = mat instead of result = mat.copy()

Почему это так? Я стремлюсь сравнить два состояния входного мата. Перед изменением кода и после него.

1 Ответ

0 голосов
/ 21 марта 2020

list.copy() клонирует только внешний список. Внутренние списки все еще являются псевдонимами, поэтому изменение одного из них изменяет result и mat. Вот минимальное воспроизведение проблемы:

>>> x = [[1, 2]]
>>> y = x.copy()
>>> y[0][0] += 1
>>> y
[[2, 2]]
>>> x
[[2, 2]]

Вы можете использовать [row[:] for row in mat] для глубокого копирования каждой строки в матрице. Нарезка и copy практически одинаковы.

Вы также можете использовать copy.deepcopy, но это излишне для этого.

Кроме того, row.remove(0) во время итерации более row, как и при переборе любого списка при добавлении или удалении из него элементов, весьма вероятно, ошибка. Рассмотрите редизайн или используйте for subrow in row[:]: как минимум.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...