我找到了一个有趣的"关于清单的问题。
list1 = [1, 2, 3]
list1.insert(3, list1)
print(list1)
[1, 2, 3, [...]]
POP = list1.pop()
print(POP)
[1, 2, 3]
list1.extend(['a', 'b', 'c'])
print(POP)
[1, 2, 3, 'a', 'b', 'c']
这些以交互模式显示。当然,我知道"插入"只能在列表中插入一个对象。但是,当我将list1
插入list1
时。它显示[...]
,这是什么意思?而且,POP = list1.pop()
,不是pop不能将最终对象返回给你?扩展列表后,最终对象应为“c”。为什么它返回整个list1
但没有[...]
?
答案 0 :(得分:4)
当您致电list1.insert(3, list1)
时,您正在索引3处向list1
插入参考,因此您的列表将变为:
[1, 2, 3, [1, 2, 3, [1, 2, 3, [1, 2, 3, [1, 2, 3, [1, 2, 3, [...
你可以这样做:
>>> list1[3]
[1, 2, 3, [...]]
>>> list1[3][3]
[1, 2, 3, [...]]
>>> list1[3][3][3]
[1, 2, 3, [...]]
>>> list1[3][3][3][3]
[1, 2, 3, [...]]
你已经无限地嵌套了list1
,这就是为什么你看到[...]
,因为列表是无限长的。
然后当您致电POP = list.pop()
时,删除了引用,list1
再次变为[1, 2, 3]
,POP
成为参考到list1
。
由于POP
是list1
的引用,当您致电list1.extend(['a', 'b', 'c'])
时,您还会将POP
更新为,他们都指向同一列表< / em>的
如果你改为:
list1 = [1, 2, 3]
list1.insert(3, list1[:])
您正在添加list1
的副本,因此会获得:
[1, 2, 3, [1, 2, 3]]
然后致电:
POP = list1.pop()
将POP
引用 new 列表。
此时做:
list1.extend(['a', 'b', 'c'])
print(POP)
将输出:
[1, 2, 3]
和
print(list1)
将输出:
[1, 2, 3, 'a', 'b', 'c']
或者,参考这张粗略的图纸(这不具有真正的代表性):
答案 1 :(得分:1)
第一个问题。你是对的insert
可以在列表中添加一个元素。但是,该元素可以是任何东西 - 另一个数字,字符串,复杂对象,列表,甚至列表本身。似乎Python足够聪明,可以确定打印list1
会导致无限输出,因为list1
具有类似的循环结构。因此它会打印一个看起来像[...]
的占位符。
第二个问题。由于pop
返回列表中的最后一个元素,但该元素是对列表本身的引用,因此您将获得该引用。它也删除了引用,因此在您看来,您正在获取原始列表的副本。这是真的,但正如你所料,对象本身已经遭受了最后一个元素的添加和删除。
答案 2 :(得分:0)
基本上,Python是基于我们将对象分配给其他对象时的引用。对于复制,如果需要列表,则需要deepcopy
或切片。以下是评论中的解释。
list1 = [1, 2, 3]
#Creating list 1
list1.insert(3, list1)
#Inserting list1 refrence at index 3, means inserting its refernce. It would become [1, 2, 3, [1, 2, 3, [1, 2, 3, [... so on]]]]
print(list1)
[1, 2, 3, [...]]
#in order to avoid this write like list1.insert(3, list1[:])
POP = list1.pop()
#Here pop is removing last index from list and returing modified list too
print(POP)
[1, 2, 3]
list1.extend(['a', 'b', 'c'])
# Here you are extending some other list not its refrence as previous
print(POP)
[1, 2, 3, 'a', 'b', 'c']