Python 将列表片段追加回原始列表是否只是复制地址?
如果我有Python中的对象列表:Python 将列表片段追加回原始列表是否只是复制地址?,python,list,copy,Python,List,Copy,如果我有Python中的对象列表: li = [obj1, obj2, obj3, ob4, obj5] 我再次将最后两个对象附加到列表的末尾: li.extend(li[-2:]) li中的副本现在有相同或不同的地址吗?如果我对附加到列表末尾的数组元素之一进行了更改li,那么末尾的副本是否也会更改?如果是这样的话,有没有更好的方法来预成型此副本?相同的地址-您可以与。如果列表中的元素是可变的,那么修改其中一个元素将修改另一个元素。如果列表中的元素是不可变的,则不能修改它们 li = [1,
li = [obj1, obj2, obj3, ob4, obj5]
我再次将最后两个对象附加到列表的末尾:
li.extend(li[-2:])
li
中的副本现在有相同或不同的地址吗?如果我对附加到列表末尾的数组元素之一进行了更改li
,那么末尾的副本是否也会更改?如果是这样的话,有没有更好的方法来预成型此副本?相同的地址-您可以与。如果列表中的元素是可变的,那么修改其中一个元素将修改另一个元素。如果列表中的元素是不可变的,则不能修改它们
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.deepcopy
不会复制该对象,除非该对象引用了其他可变对象。因此,在最后一个列表中,id(li[-1])==id(li[-3])相同的地址-您可以使用检查。如果列表中的元素是可变的,那么修改其中一个元素将修改另一个元素。如果列表中的元素是不可变的,则不能修改它们
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.deepcopy
不会复制该对象,除非该对象引用了其他可变对象。因此,在最后一个列表中,如果您以这种方式使用extend()
方法,python将引用内存中的同一对象,如果这是您想要的结果,则只需执行:
li.extend(li[-2:])
例如:
a = object()
b = object()
c = object()
d = object()
# Alternatively a, b, c, d = object(), object(), object(), object()
li = [a, b, c, d]
现在我们来看看我们的列表li
:
[<object object at 0x7fb84a31e0b0>,
<object object at 0x7fb84a31e0c0>,
<object object at 0x7fb84a31e0d0>, # c
<object object at 0x7fb84a31e0e0>] # d
您会注意到,附加的最后两个元素实际上是内存中与变量c
和d
分配到的相同的对象。这意味着对列表中的最后两个对象进行更改也将更改索引2和3处的对象
现在,如果要添加最后两个元素的副本,可以执行以下操作:
extend_elements = [copy.deepcopy(i) for i in li[-2:]]
li.extend(extend_elements)
有关复制操作,请参阅。是的,如果您以这种方式使用extend()
方法,python将引用内存中的同一对象,如果这是您想要的结果,则只需执行:
li.extend(li[-2:])
例如:
a = object()
b = object()
c = object()
d = object()
# Alternatively a, b, c, d = object(), object(), object(), object()
li = [a, b, c, d]
现在我们来看看我们的列表li
:
[<object object at 0x7fb84a31e0b0>,
<object object at 0x7fb84a31e0c0>,
<object object at 0x7fb84a31e0d0>, # c
<object object at 0x7fb84a31e0e0>] # d
您会注意到,附加的最后两个元素实际上是内存中与变量c
和d
分配到的相同的对象。这意味着对列表中的最后两个对象进行更改也将更改索引2和3处的对象
现在,如果要添加最后两个元素的副本,可以执行以下操作:
extend_elements = [copy.deepcopy(i) for i in li[-2:]]
li.extend(extend_elements)
有关复制操作,请参阅。我的问题的另一部分是:“有没有办法做到这一点,从而制作出真实的副本?”我的问题的另一部分是:“有没有办法做到这一点,从而制作出真实的副本?”