如何从循环中访问函数外部变量?解决NameError未定义错误
问题分析与解决思路
错误原因拆解
- 语法错误:
trigger_gmm() = 0是无效代码,你把变量当成函数调用了,正确赋值应为trigger_gmm = 0。 - 作用域混乱:
- 外层的
while True循环在main()函数外部,无法直接访问main()内部的局部变量trigger_gmm。 - 内部函数
spatter_tracking_cb里用了global trigger_gmm,但main()里的trigger_gmm是局部变量,和全局的trigger_gmm并非同一变量,导致全局变量从未被定义,外部循环访问时触发NameError。
- 外层的
方案一:使用全局变量
将trigger_gmm声明为全局变量,确保所有作用域都能访问到:
trigger_gmm = 0 # 全局声明变量 log = [] def spatter_tracking_cb(ts, clusters): global trigger_gmm # 声明使用全局变量 global log for cluster in clusters: log.append([ts, cluster['id'], int(cluster['x']), int(cluster['y']), int(cluster['width']), int(cluster['height'])]) if cluster['width'] >= 200: trigger_gmm = 1 else: trigger_gmm = 0 print(trigger_gmm) def main(): # 直接使用全局变量,无需重新定义 pass # 补充你的其他业务逻辑 if __name__ == "__main__": main() while True: print(trigger_gmm) if trigger_gmm == 1: print("print something")
方案二:使用nonlocal(嵌套函数场景)
若不想用全局变量,调整代码结构,将while循环放入main()内部,用nonlocal让内部函数修改外层函数的局部变量:
def main(): trigger_gmm = 0 log = [] def spatter_tracking_cb(ts, clusters): nonlocal trigger_gmm # 声明使用外层函数的局部变量 for cluster in clusters: log.append([ts, cluster['id'], int(cluster['x']), int(cluster['y']), int(cluster['width']), int(cluster['height'])]) if cluster['width'] >= 200: trigger_gmm = 1 else: trigger_gmm = 0 print(trigger_gmm) # 循环放入main内部,直接访问局部变量trigger_gmm while True: print(trigger_gmm) if trigger_gmm == 1: print("print something") if __name__ == "__main__": main()
额外注意点
- 需确保
spatter_tracking_cb函数被正确调用(你的代码中未体现调用逻辑,需补充触发它的代码,否则trigger_gmm的值始终为初始的0)。 - 嵌套函数修改外层变量时,
global用于全局变量,nonlocal用于外层函数的局部变量,二者不可混淆。
内容的提问来源于stack exchange,提问作者Maria Sabrina Ma
相关产品推荐
相关产品推荐

