在以下代码中,为什么w
在从5
弹出5
之后仍然保持v
?
>>> w = [1,2,3]
>>> v = [4,5]
>>> w.extend(v)
>>> w
[1, 2, 3, 4, 5]
>>> v
[4, 5]
>>> v.pop()
5
>>> v
[4]
>>> w
[1, 2, 3, 4, 5]
答案 0 :(得分:0)
列表的extend
方法,接受可迭代(不仅仅是另一个列表),并使用iterable中的所有项扩展列表。
官方Python文档:
通过附加iterable中的所有项来扩展列表。相当于[len(a):] = iterable。
这是一种手动迭代另一个iterable的简短方法,并append
将它们放到原始列表中:
v = [1,2,3]
w = [4,5]
for i in w:
v.append(i)
这意味着对项目的引用从可迭代复制到原始列表,因此稍后修改iterable(列表w
)不会影响原始列表(v
)。
为清楚起见,这不会改变iterable
项本身的可变性/不变性。因此,如果来自w
的项目是可变的,那么在附加到v
之后它们将保持可变(复制了引用)。
答案 1 :(得分:0)
整数1,2,3,4,5在内存中某处,w
在w.extend(v)
之后指向所有这些整数。您通过v
方法从pop
删除最后一个引用这一事实不会改变这一点。
答案 2 :(得分:0)
extend
将对象引用添加到列表中。在w.extend(v)
之后,两个列表都引用了v
中的项目。 v.pop()
从v
中移除了引用,但它仍在w
中。一旦您扩展了一个列表,其他容器的添加或删除并不重要......那些引用计数是什么。