You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 05:45:11