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

如何从循环中访问函数外部变量?解决NameError未定义错误

问题分析与解决思路

错误原因拆解

  • 语法错误:trigger_gmm() = 0 是无效代码,你把变量当成函数调用了,正确赋值应为 trigger_gmm = 0。
  • 作用域混乱:
    1. 外层的while True循环在main()函数外部,无法直接访问main()内部的局部变量trigger_gmm。
    2. 内部函数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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 01:36:25