Python3.6中的列表

时间:2017-09-07 10:16:18

标签: python python-2.7 python-3.x

我找到了一个有趣的"关于清单的问题。

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但没有[...]

3 个答案:

答案 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

由于POPlist1的引用,当您致电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']

或者,参考这张粗略的图纸(这不具有真正的代表性):

enter image description here

答案 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']