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. Я знаю, где проблема, я знаю, что проблема не в том, почему это так и как ее исправить. Я даже не забочусь об исправлении, насколько я знаю, почему то, что я пытаюсь, не работает.
У вас возник вопрос, связанный со строительством вашего списка. Поскольку вы создаете списки, добавляя их в другой список, есть несколько экземпляров, в которых отдельный список указывает на другую часть вашего списка. В результате, когда вы редактируете одну часть списка, она меняет остальные, указывающие на нее.
Я смог понять это, дублируя ваш код и вручную меняя z [1] [1] [1]. Когда я изменил это место в списке, он изменил весь список.
Решение:
Я рекомендую либо использовать вышеуказанный код комментаторов, либо останавливать повторное добавление списка в список.
Как отмечено в комментариях, это где-то копия ссылки. Поскольку у вас более двух уровней, вы не можете клонировать все ссылки, просто злоупотребляя использованием [:]
.
Самый быстрый и самый pythonic способ добиться правильного создания структуры - это удалить все ваши циклы и копии (которые, возможно, copy.deepcopy()
, даже если они работают, используя copy.deepcopy()
) и используют понимание вложенного списка:
z = [[[0]*size for _ in range(size)] for _ in range(size)]
Внутренний уровень может использовать [0]*size
потому что целые числа неизменяемы, поэтому нет необходимости в [0 for _ in range(size)]
как мы иногда видим.
Итак, одна строка, ясная и быстрая. Используй это.