gpt4 book ai didi

python - 影响其他对象列表的对象列表

转载 作者:太空宇宙 更新时间:2023-11-03 16:18:07 25 4
gpt4 key购买 nike

我正在尝试构建一个图,其中一个顶点具有字符串标识符,并且如果两个顶点的字符串标识符仅相差一个字符,则该图会连接到另一个顶点。例如,“狗”和“点”可以通过边连接。我正在使用邻接列表维护图表。但是,在验证可以连接 2 个顶点后,我将 to_vertex 对象附加到 from_vertex 对象的列表中,反之亦然。但这会导致列表包含重复的对象。以下是代码(相当密集):

class vertex():
def __init__(self, distance = -1, edges = [], name = ''):
self.name = name
self.distance = distance
self.edges = edges

def create_graph(word_dict):
graph = []

num_words = len(word_dict)

v = [vertex(name = word_dict[x]) for x in range(num_words)]

for i in range(num_words):
for j in range(i + 1, num_words):
count = 0
if len(word_dict[i]) == len(word_dict[j]):
print word_dict[i], word_dict[j]
k = 0
is_valid = True
while k < len(word_dict[i]):
print word_dict[i][k], word_dict[j][k]
if word_dict[i][k] != word_dict[j][k]:
if count == 1:
is_valid = False
break
else:
count += 1
k += 1
else:
k += 1

if is_valid == True:
v[i].edges.append(v[j])
v[j].edges.append(v[i])

graph = [v[i] for i in range(num_words)]

return graph

if __name__ == '__main__':
graph = create_graph(['bat', 'cot', 'dog', 'dag', 'dot', 'cat'])

for v in graph:
print 'Vertex name ' + v.name
for edge in v.edges:
print edge.name
print '-----------------------------'

以下是 main 中 for 循环的输出:

Vertex name bat
cat
bat
dot
cot
cat
cot
dag
dog
dot
dog
-----------------------------
Vertex name cot
cat
bat
dot
cot
cat
cot
dag
dog
dot
dog
-----------------------------
Vertex name dog
cat
bat
dot
cot
cat
cot
dag
dog
dot
dog
-----------------------------
Vertex name dag
cat
bat
dot
cot
cat
cot
dag
dog
dot
dog
-----------------------------
Vertex name dot
cat
bat
dot
cot
cat
cot
dag
dog
dot
dog
-----------------------------
Vertex name cat
cat
bat
dot
cot
cat
cot
dag
dog
dot
dog
-----------------------------

通过一些调试,我发现

if is_valid == True:
v[i].edges.append(v[j])
v[j].edges.append(v[i])

导致了这个问题,但我就是无法理解它。这不像我在第一个追加语句中修改 to_vertex 的边字段,但第一个追加语句也影响了它。

最佳答案

我不完全确定,但我认为问题是使用 edges 的默认值 [] (我认为)创建了一个唯一的对象 [ ] 然后默认初始化为该唯一对象。因此,所有边本质上都是同一个对象,当您附加到其中一个对象时,您也会附加到所有其他对象。这有道理吗?

为避免此问题,请不要使用默认 init,而是强制 self.edges = []

或者,如果您确实希望能够初始化任意边,请尝试以下操作:

def __init__(self, distance = -1, edges = None, name = ''):
self.name = name
self.distance = distance
if edges is None:
edges = []
self.edges = edges

(请告诉我这是否有效,因为我对此不确定......)

关于python - 影响其他对象列表的对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38733882/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com