将扩展在Python中创建一个新副本

时间:2017-03-05 19:50:44

标签: python

在以下代码中,为什么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]

3 个答案:

答案 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在内存中某处ww.extend(v)之后指向所有这些整数。您通过v方法从pop删除最后一个引用这一事实不会改变这一点。

答案 2 :(得分:0)

extend将对象引用添加到列表中。在w.extend(v)之后,两个列表都引用了v中的项目。 v.pop()v中移除了引用,但它仍在w中。一旦您扩展了一个列表,其他容器的添加或删除并不重要......那些引用计数是什么。