将在Python中扩展并创建新副本

将在Python中扩展并创建新副本,python,Python,在以下代码中,为什么从v弹出5后w仍保持5 >>> 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] 列表的extend方法,接受一个iterable(而不仅

在以下代码中,为什么从
v
弹出
5
w
仍保持
5

>>> 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]

列表的
extend
方法,接受一个iterable(而不仅仅是另一个列表),并使用iterable中的所有项扩展列表

Python官方文档:

通过追加iterable中的所有项来扩展列表。相当于[len(a):]=iterable

这是手动迭代另一个iterable并将它们附加到原始列表中的较短方法:

v = [1,2,3]
w = [4,5]
for i in w:
   v.append(i)
这意味着对项目的引用将从iterable复制到原始列表,因此以后修改iterable(列表
w
)不会影响原始列表(
v


为了清楚起见,这不会改变
iterable
项本身的可变性/不变性。因此,如果
w
中的项是可变的,那么它们在被附加到
v
后将保持可变(引用被复制)。

整数1,2,3,4,5在内存中的某个地方,
w
指向
w.extend(v)
之后的所有项。通过
pop
方法从
v
中删除最后一个引用的事实不会改变这一点。

extend
将对象引用添加到列表中。在
w.extend(v)
之后,两个列表都引用了
v
中的项目
v.pop()
v
中删除引用,但其仍在
w
中。一旦你扩展了一个列表,从其他容器中添加或删除都无关紧要。。。。这就是引用计数的全部内容。

与其尴尬地描述情况,不如发布代码或解释程序会话,向我们展示正在发生的事情以及输出与您预期的不同之处?请你在和我们玩捉迷藏。这是错误的,或者至少是误导。使用“扩展”时不会复制任何内容。通过使用可变对象列表执行此示例,然后通过仅访问其中一个列表来对其进行变异。如果第二个iterable中有可变项,则复制对它们的引用。因此,更改可变项将反映在所有引用上。问题是,如果调用
extend
将与第二个
列表保持任何关联(传递到
extend
),我的答案是否定的,因为
extend
的参数不一定是
列表(可变)。它可以是任何
iterable
(比如一个字符串),因此
extend
方法本身不会保留对iterable的任何引用,而是复制它的项。是的,但是extend对可变对象和不可变对象没有任何区别。使用
list.extend
时,不会复制任何对象。这就是为什么在你编辑你的帖子之前我抱怨了。没错,我更新了帖子来帮助你消除歧义。谢谢你指出这一点。我没有料到答案可能会被这样解释。