在列表中创建列表元素而不是别名

时间:2015-10-29 14:57:26

标签: python list python-3.x

基本上给出一个清单:

a = [2]

我想将输出设为:

b = [[2,2],[2,2]]

然后更改列表列表中的一个元素而不影响列表的其他列表:

b[0][1] = 1

所以b的新输出应该是:

b = [[2,1],[2,2]]

但是当我尝试制作副本以防止别名时,结果仍然归结为b = [[2,1],[2,1]],并且通过可视化工具,b[0]b[1]指向内部列表的相同地址。

这就是我试图在可视化工具中解决问题的方法     a = [2]

b = a + a 

c = [b[:]]

c1 = c[:]

d = c + c1

d[0][1] = 1    

print(d)       

打印的打印功能:

[[2,1],[2,1]]

查看可视化工具中的步骤,d中的列表指向c中相同的列表列表。无法弄清楚如何让它们不指向同一个地方。

3 个答案:

答案 0 :(得分:1)

在python中,如果你b=[a,a]*2,你将会有两个对同一列表的引用。您必须附加您想要两个单独列表的第一个元素的副本。

b = [a,a]
b == [[a,a],[a,a]] #Two references to the same list
b[0][1] = c
b == [[a,c],[a,c]]

b = [[a,a]]
b.append(b[0][:]) #Appends copy of first list
b ==[[a,a],[a,a]] #Two separate, identical lists
b[0][1] = c
b == [[a,c],[a,a]]

[:]非常重要,因此您可以附加第一个列表的元素,而不是对列表本身的引用。

答案 1 :(得分:1)

您应该使用deepcopy正确复制嵌套在对象中的对象

from copy import deepcopy
a = [2]
b = a + a
c = [b, deepcopy(b)]

答案 2 :(得分:1)

从代码开始:

a  = [2]
b  = a + a
c  = [b[:]]    # [ [2,2] ]
c1 = c[:]      # [ [2,2] ]

此时,cc1是不同的列表(您可以确认 使用id()功能)。 然而,各自的第一要素 是相同的清单。

id(c[0]) == id(c1[0])    # True

有多种方法可以在数据中创建完全独立的列表 结构体。这里有四个。

c1_alt = [list(inner_list) for inner_list in c]

c1_alt = [inner_list[:] for inner_list in c]

c1_alt = map(list, c)

from copy import deepcopy
c1_alt = deepcopy(c)