[英]python list of list unlinking the object
我有两个列表,可以合并为一个列表。 稍后,我想复制此列表,以便在不影响我的第一个列表的情况下对第二个列表进行一些操作。 我的理解是,如果使用此[:],则应取消链接列表,并在独立的内存位置中创建列表的第二个副本。 我的问题是我看不到针对这种情况的工作。 我也尝试过使用list命令,但是结果是一样的。
a = ['a','b','c']
b = ['1','2','3']
c = [a[:],b[:]] # list of list
d = c[:] # want to create copy of the list of list so I can remove last item
for item in d:
del item[-1]
# this is what I am getting returned.
In [286]: c
Out[286]:
[['a', 'b'], ['1', '2']]
In [287]: d
Out[287]:
[['a', 'b'], ['1', '2']]
[:]
仅制作浅表副本。 即,它复制列表本身,但不复制列表中的项目。 您应该使用copy.deepcopy
。
import copy
d = copy.deepcopy(c)
将列表视为具有对象的指针。 现在,您的变量是指向列表的指针。 [:]
作用是使用完全相同的指针创建一个全新的列表。 copy.deepcopy
复制对象内的所有属性/引用,以及这些属性/引用内的属性/引用。
您已经遇到了Python中的浅层复制和深层复制的概念。
当列表结构没有任何子列表时,切片运算符可以很好地工作。
list1 = ['a', 'b', 'c', 'd']
list2 = list1[:]
list2[1] = 'x'
print list1
['a', 'b', 'c', 'd']
print list2
['a', 'x', 'c', 'd']
这似乎工作正常,但是只要列表包含子列表,我们就会遇到相同的困难,即仅指向子列表的指针。
list1 = ['a', 'b', ['ab', 'ba']]
list2 = list1[:]
如果将新值分配给两个列表之一的元素,则不会有副作用,但是,如果更改子列表的元素之一,则会发生相同的问题。
这类似于您在c中修改子列表a和b的内容。
为避免此问题,您必须使用Deepcopy创建列表的Deepcopy。
可以执行以下操作:
from copy import deepcopy
list1 = ['a', 'b', ['ab', 'ba']]
list2 = deepcopy(list1)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.