python身份危机为什么l或x复制0而不是使新的0

时间:2018-12-01 07:35:27

标签: python python-3.x

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。我知道问题出在哪里,我知道问题出在哪里,而不是为什么从这里开始或如何解决。我什至不关心修复它,就像我知道为什么我尝试的东西不起作用一样。

2 个答案:

答案 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]来解决这个问题。当我更改列表中的该位置时,它更改了整个列表。

解决方案:

我建议您使用上面的注释者代码,或者停止重复将列表添加到列表中。