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

2024-10-01 00:29:57 发布

您现在位置:Python中文网/ 问答频道 /正文

以下是我的变量:

  • 可用颜色代号:[[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[inf]]
  • 邻居:4
  • 可用颜色节点[邻居]:[1,2,3]
  • 邻接列表:[[3],[2,3],[1,3],[1,2],[5],[4]]
  • 邻接列表[节点]:[4]
  • 颜色:1

代码如下:

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

我期待着:

  • 可用颜色代号:[[1,2,3],[1,2,3],[1,2,3],[1,2,3],[2,3],[inf]]

但是我得到了(1在任何地方都被移除):

  • 可用颜色角码:[[2,3],[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]]

Tags: 代码intestnode列表for节点颜色
1条回答
网友
1楼 · 发布于 2024-10-01 00:29:57

我想你应该把你的测试

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)]

相关问题 更多 >