首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >影响其他对象列表的对象列表

影响其他对象列表的对象列表
EN

Stack Overflow用户
提问于 2016-08-03 11:29:13
回答 1查看 37关注 0票数 1

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

代码语言:javascript
运行
复制
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循环的输出:

代码语言:javascript
运行
复制
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
-----------------------------

通过调试,我发现,

代码语言:javascript
运行
复制
if is_valid == True:
    v[i].edges.append(v[j])
    v[j].edges.append(v[i])

导致了这个问题,但我就是不能理解它。我并不是在修改第一个append语句中的to_vertex的edges字段,但是第一个append语句也在影响它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-03 11:35:12

我不完全确定,但我认为问题出在为edges使用默认值[],它(我认为)创建了一个唯一的对象[],然后在默认情况下初始化为那个唯一的对象。所以所有的边本质上都是同一个对象,当你附加到其中一条边时,你也会附加到所有其他边。这有意义吗?

为了避免这个问题,不要使用默认的初始化,而是强制使用self.edges = []

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

代码语言:javascript
运行
复制
def __init__(self, distance = -1, edges = None, name = ''):
    self.name = name
    self.distance = distance
    if edges is None:
        edges = []
    self.edges = edges

(让我知道这是否有效,因为我不确定这一点…)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38733882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档