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,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,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,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,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,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,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、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]] 这是我的输出。应该有一个1而不是7。我知道问题出在哪里,我知道问题出在哪里,而不是为什么从这里开始或如何解决。我什至不关心修复它,就像我知道为什么我尝试的东西不起作用一样。
答案 0 :(得分:0)
如评论中所述,它是某处的参考副本。由于您有2个以上的级别,因此无法仅通过滥用[:]
来克隆所有引用。
实现适当的结构创建最快,最方便的方法是删除所有循环和副本(例如,即使使用了copy.deepcopy()
,它们也会爬行,即使它们起作用了)并使用嵌套列表理解力:
z = [[[0]*size for _ in range(size)] for _ in range(size)]
内部级别可以使用[0]*size
,因为整数是不可变的,因此我们有时会看到[0 for _ in range(size)]
。
因此,一行清晰,快速。使用它。
答案 1 :(得分:0)
您遇到的问题是由于列表的构造。由于您是通过将列表添加到其他列表来创建列表的,因此存在多个实例,其中单个列表指向列表的另一部分。结果,当您编辑列表的一部分时,它会更改指向该列表的其他部分。
我能够通过复制代码并手动更改z [1] [1] [1]来解决这个问题。当我更改列表中的该位置时,它更改了整个列表。
解决方案:
我建议您使用上面的注释者代码,或者停止重复将列表添加到列表中。