社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

Ellis Hogan • 5 年前 • 1337 次点击  

这个问题已经有了答案:

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
 
1337 次点击  
文章 [ 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)] 正如我们有时看到的。

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