Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将列表片段追加回原始列表是否只是复制地址?_Python_List_Copy - Fatal编程技术网

Python 将列表片段追加回原始列表是否只是复制地址?

Python 将列表片段追加回原始列表是否只是复制地址?,python,list,copy,Python,List,Copy,如果我有Python中的对象列表: li = [obj1, obj2, obj3, ob4, obj5] 我再次将最后两个对象附加到列表的末尾: li.extend(li[-2:]) li中的副本现在有相同或不同的地址吗?如果我对附加到列表末尾的数组元素之一进行了更改li,那么末尾的副本是否也会更改?如果是这样的话,有没有更好的方法来预成型此副本?相同的地址-您可以与。如果列表中的元素是可变的,那么修改其中一个元素将修改另一个元素。如果列表中的元素是不可变的,则不能修改它们 li = [1,

如果我有Python中的对象列表:

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)

有关复制操作,请参阅。

我的问题的另一部分是:“有没有办法做到这一点,从而制作出真实的副本?”我的问题的另一部分是:“有没有办法做到这一点,从而制作出真实的副本?”