SyntaxError: name ‘bboxes‘ is assigned to before global declaration(python全局变量问题)
·
SyntaxError: name ‘bboxes’ is assigned to before global declaration
出现这个报错的原因,可能是在同一个函数中,重复使用global声明导致报错,一般应在函数开头直接使用global声明,无需每次使用变量前都进行函数声明。
全局变量使用注意1
global变量声明出现了问题,刚开始的时候我是这么写的:
def demo():
global box
...
if __name__ == '__main__':
global box
if not box:
...
这样写会一直出现“变量box未定义“的报错,正确的语法应该是,我们将主函数中的声明去掉,直接在全局变量定义一个box,然后再去在各个函数中使用global声明该变量。
box = []
def demo():
global box
...
if __name__ == '__main__':
if not box:
...
这样写的话仍然有问题,我们发现再使用cv2.putText()函数时,会出现字体打印重影,原因是我们未在显示后及时清空box变量,正确写法如下:
for x, y, w, h in face:
cv2.rectangle(img, (x, y), (x+w, y+h), color=(0, 0, 255), thickness=2)
# cv2.circle(img,center=(x+w//2,y+h//2),radius=w//2,color=(0,255,0),thickness=1)
# 人脸识别
ids, confidence = recogizer.predict(gray[y:y + h, x:x + w])
global bboxes
bboxes = [] # 这里必须进行变量清空操作,否者结果中会出现字体无法清空现象,字体叠加
bboxes.append([x,y,x+w,x+h]) # bounding box 的坐标
# print(x,y,x+w,x+h)
# print('标签id:',ids,'置信评分:', confidence,数值越小,越可信)
if confidence > 80:
global warningtime
warningtime += 1
if warningtime > 100:
warning()
warningtime = 0
cv2.putText(img, 'unkonw', (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (255, 255, 0), 1)
else:
# 以左上顶角为原点,向下向右为正方向
cv2.putText(img, str(names[ids - 1]) + ' ' + 'with no mask', (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (255, 255, 0), 1)
我们可以看到bboxes变量(上面所说的box变量),在每次经过for循环确定人脸的位置后,是将四个角点变量存储在变量中,没循环一次,都应先将变量做一次清空操作,可以保证后续打印字体没有重影。
全局变量使用注意2
UnboundLocalError: local variable ‘names’ referenced before assignment
在局部函数中更改全局变量,就会出现此错误。
对于全局变量的修改:
- 如果全局变量是int或者str,那么如果想要在函数中对函数变量进行修改,则需要先在函数内,声明其为global,再进行修改
- 如果是list或者dict则可以直接修改
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)