python - 将列表切片追加回原始列表是否只是复制地址?

标签 python list copy

如果我在 Python 中有一个这样的对象列表:

li = [obj1, obj2, obj3, ob4, obj5]

然后我再次将最后两个对象附​​加到列表的末尾:

li.extend(li[-2:])

li 中的重复项现在具有相同或不同的地址吗?如果我更改已附加到列表 li 末尾的数组元素之一,末尾的副本是否也会更改?如果可以,是否有更好的方法来执行此副本?

最佳答案

相同的地址 - 您可以使用 id 进行检查.如果列表的元素是可变的,那么修改一个将修改另一个。如果列表的元素是不可变的,则您无法修改它们。

li = [1, 1.0, None, ['a', 'b'], ('c', 'd')]

li.extend(li[-2:])
print(li)
# outputs [1, 1.0, None, ['a', 'b'], ('c', 'd'), ['a', 'b'], ('c', 'd')]

li[-2].pop()
print(li)
# outputs [1, 1.0, None, ['a'], ('c', 'd'), ['a'], ('c', 'd')]
# Note that elemnts at indices -2 and -4 have changed since id(li[-2]) == id(li[-4])

print(id(li[-1]) == id(li[-3]))
# True

要添加深拷贝,您可以使用 copy module .

li = [1, 1.0, None, ['a', 'b'], ('c', 'd')]

li.extend(list(map(copy.deepcopy, li[-2:])))
print(li)
# outputs [1, 1.0, None, ['a', 'b'], ('c', 'd'), ['a', 'b'], ('c', 'd')]

li[-2].pop()
print(li)
# outputs [1, 1.0, None, ['a', 'b'], ('c', 'd'), ['a'], ('c', 'd')]
# Note that only the list at index -2 has changed since id(li[-2]) != id(li[-4])

请注意,对于不可变对象(immutable对象),copy.deepcopy 不会复制该对象,除非该对象引用了其他可变对象。所以在最后一个列表中 id(li[-1]) == id(li[-3])

关于python - 将列表切片追加回原始列表是否只是复制地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38488464/

相关文章:

python - list(dict.items()) 是线程安全的吗?

python - 将 url 参数从 Flask 传递到 Angular

python - 类之间共享属性 : is multi-inheritance right and "pythonic" here?

java - Android 免费应用程序中的复制保护

copy - 在同一数据库DB2中创建表的副本

python - 堆叠色图

java - 使用节点的自定义链表

python - 删除字符串中特定索引处的 'range' 个字符

java - 从jar中高效提取文件

python - 如何在 Python 中获取列表中元素的数量(列表的长度)?