当我遇到这个问题时,我正试图找到一个问题的解决方案。我试图使用insert将一个列表插入到同一个列表中。但是我得到了一个新列表应该在哪里的...。
插入相同的列表
layer1 = [1,2,3,4]
layer1.insert(len(layer1)//2,layer1)奇怪的是,我得到了输出
[1, 2, [...], 3, 4]插入唯一列表
现在假设我将一个唯一的列表插入到layer1中。
layer1 = [1,2,3,4]
layer2 = [1,2]
layer1.insert(len(layer1)//2,layer2)
print(layer1)如果没有...,我的输出就像预期的那样
[1, 2, [1, 2, 3], 3, 4]期望输出
如何使用insert获得此输出?
[1, 2, [1, 2, 3, 4], 3, 4]发布于 2021-04-24 04:57:53
省略的原因
您正在尝试将对象插入到位置2 (len(layer1)//2)的自身中。您可以考虑省略号 (.)作为指向对象本身的指针。
str / repr函数受到保护,以避免无限递归,并显示省略号(.)。请参考这。
--不可能打印随着插入自身而修改的对象,因为它将进入无限递归。想想看,如果您通过插入它自己来修改列表,那么您所引用的新更新列表也将插入到它自己中,因为您只是指向该对象。
如果您试图访问列表中的省略对象,这一点就很明显了-
layer1 = [1,2,3,4]
layer1.insert(len(layer1)//2,layer1)
print('list:',layer1)
print('ellipsis:', layer1[2])list: [1, 2, [...], 3, 4]
ellipsis: [1, 2, [...], 3, 4]原始列表中的任何更新也必须反映在插入的项中,反之亦然。因此,它被显示为省略号。
解析打印
一种解决这个问题的方法是使用一个拷贝-
layer1 = [1,2,3,4]
layer1.insert(len(layer1)//2,layer1[:]) #<--- slicing returns copy
layer1[1, 2, [1, 2, 3, 4], 3, 4]详细信息这里。
发布于 2021-04-24 04:46:05
当您将1、2、3、4插入到它中时,您真正拥有的是:
layer1 = [1, 2, layer1, 3, 4]如果您“打开”layer1 (点)以查看其中的内容,您将得到:
layer1 = [1, 2, [1, 2, layer1, 3, 4], 3, 4]正如你所看到的,这将永远持续下去。这个列表是“自我参照”,它指的是自己。
相反,您需要制作列表的副本。
layer1 = [1,2,3,4]
layer1.insert(len(layer1)//2,layer1.copy())发布于 2021-04-24 04:57:15
您正在通过向自身插入列表来创建自引用列表。它就像一个没有任何while(1)的break。
也许你可以用这个来达到你的目的:
layer1 = [1,2,3,4]
layer1.insert(len(layer1)//2,layer1[:])https://stackoverflow.com/questions/67239386
复制相似问题