Python节点链接异常:类属性误用致实例共享列表问题求助
问题分析与解决:节点链接列表共享导致的异常
你遇到的问题根源非常典型——你在Node类里定义的all_link_incoming和all_link_outgoing是类级别的属性,而非实例属性。
在Python中,直接定义在类内部、不在__init__方法里的属性,会被这个类的所有实例共享。也就是说,你创建的所有Node对象,不管是输入节点还是输出节点,都共用同一个all_link_incoming列表和同一个all_link_outgoing列表。这就解释了为什么:
- 循环一次时,输出节点2也会出现那个链接——因为所有节点的列表是同一个
- 最终每个输出节点都有4个链接——所有添加的链接都被放到了同一个共享列表里,所有节点都能看到
另外,你的Link类也有问题:原来的node_incoming和node_outgoing是类属性,初始值为0.0,这显然无法正确保存对应的节点对象,你需要给Link添加构造方法来接收并存储节点实例。
修正方案
把Node类的链接列表改成实例属性,同时完善Link类的构造方法:
class Node: def __init__(self): # 每个Node实例都会拥有独立的列表,不再共享 self.all_link_incoming = [] self.all_link_outgoing = [] class Link: def __init__(self, node_incoming, node_outgoing): # 用实例属性保存对应的节点对象 self.node_incoming = node_incoming self.node_outgoing = node_outgoing
验证修正后的逻辑
用你原来的循环代码测试:
all_node_input = [Node(), Node()] all_node_output = [Node(), Node()] for node_input in all_node_input: for node_output in all_node_output: link = Link(node_input, node_output) node_input.all_link_outgoing.append(link) node_output.all_link_incoming.append(link) # 检查输出节点的链接数量 print(len(all_node_output[0].all_link_incoming)) # 输出:2 print(len(all_node_output[1].all_link_incoming)) # 输出:2
现在每个输出节点只会包含来自两个输入节点的链接,完全符合你的预期。
内容的提问来源于stack exchange,提问作者user8827417
相关产品推荐
相关产品推荐

