将在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
时,不会复制任何对象。这就是为什么在你编辑你的帖子之前我抱怨了。没错,我更新了帖子来帮助你消除歧义。谢谢你指出这一点。我没有料到答案可能会被这样解释。