Python报local variable 'message' referenced before assignment排查
你运行的原始代码如下:
liquid = [l_press,l_dosage,l_bottle,l_position,l_clog,l_counter] for j in range(len(liquid)): data = liquid_filling(liquid[j]) publish.single(liquid[j],data,qos = 0, hostname = hostname,port=2259) def liquid_filling(topic): if topic == "Liquid_filling/pressure": message = random.uniform(4.0,5.0) elif topic == "Liquid_filling/dosage": message = random.uniform(495.0,505.0) elif topic == "Liquid_filling/bottle_presence" or topic== "Liquid_filling/position" or topic=="Caps/position": if i % 2 == 0: message = 'YES' else: message = 'NO' elif topic == "Liquid_filling/counter": message = i return message
运行时抛出错误:
Error: local variable 'message' referenced before assignment
问题根因
报错和缩进无关,是两个逻辑漏洞导致的:
liquid_filling函数内的message变量仅在if/elif分支命中时才会被赋值,只要传入的topic没有匹配到任何分支,执行到return message时就会触发「变量赋值前被引用」错误。你定义的liquid列表包含l_clog项,但是函数的判断分支里完全没有处理对应topic的逻辑,传入这个值时必然不会给message赋值。- 函数内使用的变量
i既没有作为参数传入,也没有声明为全局变量,就算topic匹配到对应分支,后续也会触发i未定义的错误。
修复方法
- 函数入口处先给
message设置默认兜底值,覆盖所有分支未命中的场景; - 补全
l_clog对应topic的处理逻辑; - 把循环计数变量通过参数传入函数,避免全局变量导致的逻辑混乱。
修复后可运行的参考代码:
import random import paho.mqtt.publish as publish # 统一定义topic常量,避免传参和判断时字符串拼写不匹配 l_press = "Liquid_filling/pressure" l_dosage = "Liquid_filling/dosage" l_bottle = "Liquid_filling/bottle_presence" l_position = "Liquid_filling/position" l_clog = "Liquid_filling/clog" l_counter = "Liquid_filling/counter" hostname = "替换为实际的MQTT服务地址" liquid = [l_press, l_dosage, l_bottle, l_position, l_clog, l_counter] def liquid_filling(topic, count): # 设置默认兜底值,避免未匹配分支时变量不存在 message = None if topic == "Liquid_filling/pressure": message = random.uniform(4.0, 5.0) elif topic == "Liquid_filling/dosage": message = random.uniform(495.0, 505.0) elif topic in ("Liquid_filling/bottle_presence", "Liquid_filling/position", "Caps/position"): message = "YES" if count % 2 == 0 else "NO" elif topic == "Liquid_filling/clog": # 按实际业务需求修改堵塞检测的返回逻辑 message = "NO" elif topic == "Liquid_filling/counter": message = count return message # 用enumerate直接拿到循环索引,作为计数传入函数 for idx, topic in enumerate(liquid): pub_data = liquid_filling(topic, idx) publish.single(topic, pub_data, qos=0, hostname=hostname, port=2259)
内容的提问来源于stack exchange,提问作者cbcliff47
相关产品推荐
相关产品推荐

