Python:删除列表中列表中的整数是删除所有子列表列表中的整数

时间:2018-02-12 08:26:10

标签: python list multidimensional-array

以下是我的变量:

  • availableColorsForNode:[[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[inf]]
  • 邻居:4
  • availableColorsForNode [neighbor]:[1,2,3]
  • adjacencyList:[[3],[2,3],[1,3],[1,2],[5],[4]]
  • adjacencyList [node]:[4]
  • 颜色:1

以下是代码:

for neighbor in adjacencyList[node]:
    if color in availableColorsForNode[neighbor]: 
        availableColorsForNode[neighbor].remove(color)  #problem is here somehow

我期待:

  • availableColorsForNode:[[1,2,3],[1,2,3],[1,2,3],[1,2,3],[2,3],[inf]]

但我得到了(其中1被删除):

  • availableColorsForNode:[[2,3],[2,3],[2,3],[2,3],[2,3],[inf]]

为什么会这样? 当我进行如下的简单测试时,我得到预期的输出:

test = [[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]]
test[4].remove(1)
print(test)
  • 输出为[[1,2,3],[1,2,3],[1,2,3],[1,2,3],[2,3],[1,2,3] ]

1 个答案:

答案 0 :(得分:3)

我假设您将测试设置得更多或更像

lst = [1, 2, 3]

test = [lst, lst, lst, lst, lst]  # or: test = [lst] * 5
test[4].remove(1)
print(test)

test现在包含对相同列表的引用(而不是列表的相同副本)。如果您在其中任何一个上致电.remove(例如test[4].remove(1)),则更改将反映在所有这些内容中。因为test中的所有项目仍然引用相同的列表lst

以下是关于如何解决此问题的四种不同建议(如果您的列表包含不需要的不可变数据类型deepcopy);我建议你选择其中一个,不要混合它们;这里的代码只是为了展示可能性......:

from copy import copy, deepcopy

lst = [1, 2, 3]

test = [list(lst), lst[:], copy(lst), deepcopy(lst)]
test[2].remove(1)
print(test)

如果你想重复这些,你可以这样做:

test = [lst[:] for _ in range(5)]