Python节点列表对象数据点共享异常问题求助
问题:家庭传感器网络节点数据点分配异常
我正在搭建一个家庭传感器网络,拥有多个节点(Arduino部署位置),每个节点需要上报多个数据点。我将所有节点(node对象)存储在一个列表中,每个node对象包含一个datapoint对象列表。但我无法为单个节点分配数据点,数据点会被分配给节点列表中的所有节点。
原代码
class datapoint: name = "" node_number = 0 node_array_index = 0 active = False log_next = False def __init__(self, name): self.name = name class node: address = [0]*8 name = " " message_now = False datapoints = [] def __init__(self, name ): self.name = name node_list = [] node_list.append(node("Garden")) node_list.append(node("Kitchen")) node_list[0].datapoints.append(datapoint("Humidity")) node_list[1].datapoints.append(datapoint("Temperature")) for i in range(0,len(node_list[1].datapoints)): print(node_list[1].datapoints[i].name)
运行结果
Humidity Temperature
预期仅返回Temperature,因为只有Temperature被分配给node_list[1].datapoints。即使先创建对象再添加到列表,结果也相同。
问题原因
你定义的node类中,datapoints = []是类属性,而非实例属性。类属性会被该类的所有实例共享,所以不管你给哪个node实例的datapoints添加元素,都是在操作同一个全局列表,导致所有节点的datapoints都会同步更新。
解决方案
将datapoints移到node类的__init__方法中,作为实例属性(绑定到self),这样每个node实例都会拥有独立的datapoints列表。同时建议把datapoint类的其他属性也移到__init__中,避免同类共享问题。
修正后的代码
class datapoint: def __init__(self, name): self.name = name self.node_number = 0 self.node_array_index = 0 self.active = False self.log_next = False class node: def __init__(self, name ): self.name = name self.address = [0]*8 self.message_now = False self.datapoints = [] # 每个实例独立维护的列表 node_list = [] node_list.append(node("Garden")) node_list.append(node("Kitchen")) node_list[0].datapoints.append(datapoint("Humidity")) node_list[1].datapoints.append(datapoint("Temperature")) for dp in node_list[1].datapoints: print(dp.name)
修正后运行结果
Temperature
内容的提问来源于stack exchange,提问作者Penultimate_Airbender
相关产品推荐
相关产品推荐

