Python:虽然使用了list()、copy()等,但复制的列表会不断更改所有其他列表中的元素



我的代码中有一个错误,我试图使用不同的方法来修复它,但它仍然不起作用。我已经将我的原始代码缩小到下面的重要部分。我使用文本文件作为输入,它包含顶点数(第一行(、边数(第二行(、颜色数(第三行(,其余行由表示边的两个数字(用空格分隔(组成。重要的是边缘。

输入

6
5
3
6 2
2 3
3 4
4 6
6 2

代码

# An instance of m-Coloring Graph problem (NP-hard) Karp-reduced to an
# instance of the Casting problem.
#! /usr/bin/python3
def subgraph(v,aux1,aux2):
print(nhoods)
sg = list(aux2[v-1])
aux1.remove(sg)
sg.remove(v)
for i, nhood in enumerate(aux1):
try:
aux1[i].remove(v)
aux2[i].remove(v)
except ValueError:
pass  # do nothing!        
for vertex in sg:
sg.extend(subgraph(vertex,aux1,aux2))
return sg
line = 0
edges = []
inputs = "testfile.txt"
f = open(inputs,"r")
for i in f.readlines():
line += 1
if line == 1:
V = int(i)
elif line == 2:
E = int(i)
elif line == 3:
m = int(i)
else:
edge = [int(n) for n in i.split()]
if edge in edges:
pass    # Removes double edges
else:
edges.append(edge)
conv = []   # Connected vertices
for edge in edges:
for vend in edge:
if vend in conv:
pass
else:
conv.append(vend)   # Stores none-isolated vertices
# Create lists of neighbors/neighborhoods for each vertex
nhoods = []
for v in conv:
nhood = []
for edge in edges:
if v == edge[0]:
nhood.append(edge[1])
elif v == edge[1]:
nhood.append(edge[0])
nhood.append(v)
nhoods.append(nhood)
# Create list of connected subgraphs
aux1 = list(nhoods)
aux2 = list(nhoods)
#for nhood in nhoods:
#    aux1.append(nhood)
#    aux2.append(nhood)
SG = []     # List of subgraphs
while aux1 != []:
v = aux1[0][0]
SG.append(subgraph(v,aux1,aux2))

现在,当我运行代码时,我希望它做的是创建名为aux1aux2nhoods列表的复制列表(在代码的第62行(。(我后来用这些来寻找输入图中的连通子图(。但是,当我修改复制的列表aux1aux2之一时,nhoods会更改!但当我使用list((函数时,这种情况不应该发生,对吧?我尝试过使用copy((函数和for循环,但没有更好的结果。在我看来,这些列表似乎指的是记忆中的同一个位置,但为什么呢?是不是列表中的元素(即列表(指向了同一个记忆点?我该如何解决此问题?

我希望我没有错过任何东西,否则就去问,提前谢谢!

问候//

我发现您面临的问题是列表的可变性。此外,您还需要了解软拷贝和硬拷贝的区别。无论你遵循的是软拷贝方法。由于可变对象中有可变元素,因此需要硬拷贝。对于硬拷贝,您可以使用copy.deepcopy方法。

import copy
...
aux1 = copy.deepcopy(nhoods)
aux2 = copy.deepcopy(nhoods)

现在CCD_ 8&在与CCD_ 10不同的存储器上创建CCD_。

相关内容

  • 没有找到相关文章

最新更新