Py学习  »  Python

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

Ellis Hogan • 5 年前 • 1449 次点击  

这个问题已经有了答案:

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 still的重复实例。 [[[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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。我知道问题在哪里,我知道问题是什么,只是不知道为什么,也不知道如何解决。我甚至不在乎修复它,因为我知道为什么我所尝试的是不起作用的。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/43274
 
1449 次点击  
文章 [ 2 ]  |  最新文章 5 年前
John McGilligan
Reply   •   1 楼
John McGilligan    6 年前

你现在的问题是由于你的清单的结构。由于通过将列表添加到其他列表中来创建列表,因此存在多个实例,其中单个列表指向列表的另一部分。因此,当您编辑列表的一部分时,它会更改指向它的其他部分。

我可以通过复制代码并手动更改z[1][1][1]来解决这个问题。当我改变列表中的这个位置时,它改变了整个列表。

解决方案:

我建议要么使用上面的注释代码,要么停止重复向列表中添加列表。

Jean-François Fabre
Reply   •   2 楼
Jean-François Fabre    6 年前

如评论中所述,它是某个地方的参考副本。由于您有两个以上的级别,因此不能仅通过滥用 [:] .

实现正确结构创建的最快、最恶毒的方法是删除所有循环和副本(即使它们有效,也可能会使用 copy.deepcopy() 例如)并使用 嵌套列表理解 :

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

内部层可以使用 [0]*size 因为整数是不可变的,所以不需要 [0 for _ in range(size)] 正如我们有时看到的。

所以,一条线,清晰,快速。用它。