繁体   English   中英

python列表取消链接对象

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM