将列表插入同一列表时的省略号

ellipsis when inserting list into same list

当我遇到这个问题时,我正试图找到一个问题的解决方案。我试图使用插入将列表插入到同一个列表中。但是我得到一个 ... 新列表应该在的位置。

正在插入相同的列表

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]

当你把[1, 2, 3, 4]插入它本身时,你真正拥有的是:

layer1 = [1, 2, layer1, 3, 4]

如果您“打开”第 1 层(点)以查看其中的内容,您会得到:

layer1 = [1, 2, [1, 2, layer1, 3, 4], 3, 4]

如您所见,这将永远持续下去。列表是“self-referential”的,它指的是它自己。

相反,您需要制作列表的副本。

layer1 = [1,2,3,4]
layer1.insert(len(layer1)//2,layer1.copy())

您正在通过向自身插入列表来创建自引用列表。就像 while(1) 没有任何 break.

也许您可以使用它来实现您的目的:

layer1 = [1,2,3,4]
layer1.insert(len(layer1)//2,layer1[:])

省略号的原因

您正在尝试将对象插入其自身的位置 2 (len(layer1)//2)。您可以将 ellipsis (...) 视为指向对象本身的指针。

The str / repr functions have been protected against this to avoid infinite recursion, and show an ellipsis instead (...). Refer .

插入自己修改的对象是不可能打印出来的,因为会进入无限递归。想一想,如果你通过插入修改列表将其自身插入其中,您所指的新更新列表也会插入到自身中,因为您只是指向该对象。

如果您尝试访问列表中的省略号对象,这会变得很明显 -

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]

详情here.