基本上给出一个清单:
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中相同的列表列表。无法弄清楚如何让它们不指向同一个地方。
答案 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] ]
此时,c
和c1
是不同的列表(您可以确认
使用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)