кризис идентичности python, почему l или x копирует 0, а не создает новый 0 [duplicate]

1
def create_octahedron(size):
  l = [0]
  y = []
  z = []
  if size % 2 == 0 or size <= 1:
    return x

  for i in range(size - 1):      
    l += [0]
  x = l[:]
  for i in range(size):
    y += [x[:]]
  for i in range(size):
    z += [y[:]]

  for i in range(size):

    for u in range(size):

        for v in range(size):

          if i == len(z)//2:
            if u == len(y)//2:
                if v == len(x)//2:
                    z[i][u][v] = 1




print(z)

Я отправил аналогичный вопрос на этот вопрос, и теперь я пытаюсь понять, почему еще есть повторный экземпляр 1. [[0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0] [0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0]], [[0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0]], [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]], [[0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0]], [[0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0]], [[0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0]], [[0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0] [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]]] мой выход. должен быть один, а не 7. Я знаю, где проблема, я знаю, что проблема не в том, почему это так и как ее исправить. Я даже не забочусь об исправлении, насколько я знаю, почему то, что я пытаюсь, не работает.

  • 3
    Ломтики мелкие копии.
  • 0
    хорошо .. Может кто-нибудь уточнить это. Я посмотрел, но все еще не могу это исправить. Я пытался использовать Deepcopy, и это не сработало.
Теги:
python-3.x

2 ответа

0

У вас возник вопрос, связанный со строительством вашего списка. Поскольку вы создаете списки, добавляя их в другой список, есть несколько экземпляров, в которых отдельный список указывает на другую часть вашего списка. В результате, когда вы редактируете одну часть списка, она меняет остальные, указывающие на нее.

Я смог понять это, дублируя ваш код и вручную меняя z [1] [1] [1]. Когда я изменил это место в списке, он изменил весь список.

Решение:

Я рекомендую либо использовать вышеуказанный код комментаторов, либо останавливать повторное добавление списка в список.

0

Как отмечено в комментариях, это где-то копия ссылки. Поскольку у вас более двух уровней, вы не можете клонировать все ссылки, просто злоупотребляя использованием [:].

Самый быстрый и самый pythonic способ добиться правильного создания структуры - это удалить все ваши циклы и копии (которые, возможно, copy.deepcopy(), даже если они работают, используя copy.deepcopy()) и используют понимание вложенного списка:

 z = [[[0]*size for _ in range(size)] for _ in range(size)]

Внутренний уровень может использовать [0]*size потому что целые числа неизменяемы, поэтому нет необходимости в [0 for _ in range(size)] как мы иногда видим.

Итак, одна строка, ясная и быстрая. Используй это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню