gpt4 book ai didi

Python 图形结构和令人惊讶的列表处理

转载 作者:行者123 更新时间:2023-11-28 17:41:53 25 4
gpt4 key购买 nike

我正在实现一个图形结构(仅用于练习目的),现在我遇到了两种我无法向自己解释的行为。

首先,这里是代码

class Node:
data = None
def __init__(self, data):
self.data = data
def __str__(self):
return str(self.data)
def __repr__(self):
return self.__str__()

class GraphNode(Node):
children = []
def __init__(self, list_of_nodes=None, data=None):
if list_of_nodes != None:
for node in list_of_nodes:
children.add(node)
self.data = data

def createGraphStructure():
node1 = GraphNode(data=1)
node2 = GraphNode(data=2)
node3 = GraphNode(data=3)
node4 = GraphNode(data=4)
node5 = GraphNode(data=5)
node6 = GraphNode(data=6)
node7 = GraphNode(data=7)
node8 = GraphNode(data=8)

node1.children.append([node2, node3, node4])
node2.children.append([node5, node6, node7])
node4.children.append([node8])

#just a random test/visualization
print node1.children
#another random printout to test/visualize
for n in node1.children:
print n.data

return node1

if __name__ == "__main__":
root = createGraphStructure()
#do stuff with graph, bfs dfs whatever

现在第一个令人惊讶的事情是:print node1.children in createGraphStructure() 将打印出以下内容:[[2, 3, 4], [5, 6, 7], [8 ]],但我希望它只打印出节点 1 的直接子节点,如 [2, 3, 4]。我在这里完全一无所知。

其次,部分

for n in node1.children:
print n.data

抛出以下异常:

File "C:/yeah/you/would/like/to/see/my/path/right?/datastructures.py", line 54, in createGraphStructure
print n.data
AttributeError: 'list' object has no attribute 'data'

看起来,n 是一个列表,但为什么呢?它不应该是列表中的一个节点吗?我确定对此有一些明显的解释,但我无法弄清楚。也因为我不太精通 Python,尤其是 OO。

谢谢!

最佳答案

首先,当你这样做时:

class GraphNode(Node):
children = []

children 这里是class 数据,不是instance 数据。也就是说,所有 您的节点都共享相同的 children 对象,因此每个 append 调用实际上都在更改相同的变量。

要获得实例数据,您需要在一个方法中创建children,以便它可以访问对实例的引用。通常,这是在 __init__ 中完成的:

class GraphNode(Node):
def __init__(self, list_of_nodes=None, data=None):
self.children = [] # <-- initialised here
if list_of_nodes != None:
for node in list_of_nodes:
children.add(node)
self.data = data

第二个问题是,您在似乎打算使用 extend 的地方使用了 append

append 获取一个对象,并将该对象添加到列表中:

>>> l = [1, 2, 3]
>>> l.append([4, 5, 6])
>>> l
[1, 2, 3, [4, 5, 6]]

看到这里,列表中的第四项是另一个列表。相反,使用 extend,它接受一个列表,并将它与调用它的列表连接起来:

>>> l = [1, 2, 3]
>>> l.extend([4, 5, 6])
>>> l
[1, 2, 3, 4, 5, 6]

关于Python 图形结构和令人惊讶的列表处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23159207/

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