如果我在 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/