Путать с вложенным списком - PullRequest
1 голос
/ 26 октября 2019

Я создал простую функцию для отображения True или False во вложенный список «посещенных» в зависимости от значения во вложенном списке «лабиринт». Я попытался проанализировать его, но не смог выяснить, почему позиция (1,0) обновляется с помощью True, хотя позиция (1,0) не имеет «=» или «|»стоимость. Любая помощь.

def start_matrix(maze):
     visited = [[False]*len(maze[0])]*len(maze)
     print(visited)
     for i in maze:
       for k in i:
          if k == '=' or k == '|':
            print(maze.index(i),i.index(k))
            print(visited[maze.index(i)][i.index(k)])
            visited[maze.index(i)][i.index(k)] = True
            print(visited)
return None

Ввод

map1 = [['=',' ','|'],[' ',' ',' ']]
start_matrix(map1)

Ввод:

[[False, False, False], [False, False, False]]
0 0
False
[[True, False, False], [True, False, False]]
0 2
False
[[True, False, True], [True, False, True]]

1 Ответ

1 голос
/ 26 октября 2019

Проблема в вашем коде связана с мелкими и глубокими копиями . Когда ваш код назначен посещенным, выполните:

visited = [[False] * len(maze[0])] * len(maze)

Что он действительно делает, это сначала создает список False (и это нормально, так как False является типом значения), но затем создает сценарии для двух копий списка,Списки являются объектами, поэтому результатом является список с двумя ссылками на один и тот же список False. Затем, когда вы изменили первый внутренний список, он также изменил значения второго списка, так как оба были одинаковыми.

Исправление для этого заключается в изменении конструкции посещения с использованием понимания списка для создания двух копийвнутренний список:

visited = [[False] * len(maze[0]) for n in range(len(maze))]

Тогда полный код будет:

def start_matrix(maze):
    visited = [[False] * len(maze[0]) for n in range(len(maze))]
    print(visited)
    for i in maze:
        for k in i:
            if k == '=' or k == '|':
                print(maze.index(i), i.index(k))
                print(visited[maze.index(i)][i.index(k)])
                visited[maze.index(i)][i.index(k)] = True
                print(visited)
    return None

map1 = [['=', ' ', '|'], [' ', ' ', ' ']]
start_matrix(map1)

с выводом:

[[False, False, False], [False, False, False]]
0 0
False
[[True, False, False], [False, False, False]]
0 2
False
[[True, False, True], [False, False, False]]

Надеюсь, все ясно. Если нет, пожалуйста, дайте мне знать, и я расширю.

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