Python中UnboundLocalError求助:变量pic_name未赋值即引用
嘿,看了你的代码和运行日志,问题其实很清晰,咱们一步步拆解:
首先说那个扎眼的UnboundLocalError: local variable 'pic_name' referenced before assignment——这是因为你的代码里有一条路径没给pic_name赋值,就直接去用它了。
看你detection_count == 0的分支:当index_image_processing <=6时,你调用了pic_plate_detect(img),但这个分支里完全没给pic_name赋值啊!等递归调用完回到这里,直接执行print pic_name,Python当然懵了——这变量哪来的?
然后看你的运行日志,先是正常处理了detection_count=1的情况(输出了done),结果又冒出来detection_count=0的执行流程,这说明pic_plate_detect(img)内部肯定又调用了check_count,导致函数递归执行了,相当于嵌套着跑了两次check_count。
怎么修复?
1. 给所有代码路径都加上pic_name的定义
最简单的办法是先初始化pic_name,然后在每个分支里覆盖它,或者在缺失的分支里补上赋值:
def check_count(img, count): global index_image_processing detection_count = count print ('index= ', index_image_processing) print ('detection_count = ', detection_count) # 先给pic_name一个初始值,避免没定义就用 pic_name = None if detection_count == 0: index_image_processing += 1 print ('1-index= ', index_image_processing) if index_image_processing <= 6: pic_plate_detect(img) # 这里根据你的需求赋值,比如标记是重试的图片 pic_name = f'retry_{index_image_processing}.jpg' else: print ('Cannot find') pic_name = 'Fail.jpg' print ('2-index= ', index_image_processing) print ('detection_count=', detection_count) elif detection_count == 1: pic_name = 'single.jpg' print ('detection_count == 1') elif detection_count >= 2: pic_name = 'muti_result.jpg' print ('detection_count >= 2') # 确认pic_name有值再执行保存操作 if pic_name is not None: print(pic_name) pic_path = './' + pic_name cv2.imwrite(pic_path, img) print ('done')
2. 检查递归调用的逻辑
从日志看,程序跑了两次check_count,这说明pic_plate_detect内部调用了当前函数。如果这不是你想要的,得改pic_plate_detect的逻辑,别让它重复调用check_count;如果是故意要递归,那得确保递归有明确的终止条件(比如index_image_processing >6就停),同时每个递归分支都处理好pic_name的赋值。
为啥会出这个错?
Python里有个规则:如果函数内部对某个变量做了赋值操作,那这个变量会被视为局部变量。要是有一条代码路径没给它赋值,后面又想用它,就会触发这个未绑定的错误。你原来的代码刚好踩了这个坑——detection_count=0且index<=6的分支没给pic_name赋值,递归回来就直接用,可不就报错嘛。
内容的提问来源于stack exchange,提问作者WinJia Cheng

