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

Python报错:local variable 'counter' referenced before assignment 求助

解决Python中"local variable 'counter' referenced before assignment"错误

问题原因

在Python中,若函数内部对全局变量执行赋值操作(比如counter += 1本质是counter = counter + 1),解释器会默认将该变量视为局部变量。你的summarize_text函数里先引用了counter生成文件名,之后又对它赋值,Python会认定counter是局部变量,而引用时它还未在局部定义,因此报错。

解决方案

方案1:用global声明全局变量

在函数开头明确告诉解释器,counter是外部定义的全局变量,不要当作局部变量处理:

def summarize_text(text: str, max_len: int) -> str:
    global counter  # 声明counter为全局变量
    try:
        summary = summarizer(text, max_length=max_len, min_length=100, do_sample=False)
        with open('parsed_'+str(counter)+'.txt', 'w') as f:
            f.write(text)
        counter += 1
        return summary[0]["summary_text"]
    except IndexError as ex:
        logging.warning("Sequence length too large for model, cutting text in half and calling again")
        return summarize_text(text=text[:(len(text) // 2)], max_len=max_len) +" "+ summarize_text(text=text[(len(text) // 2):], max_len=max_len)

方案2:用可变对象存储计数器(规避全局变量)

Python中可变对象(如列表、字典)的内部修改不需要global声明,可将计数器放在列表中:

# 全局变量改为列表
counter = [1]

def summarize_text(text: str, max_len: int) -> str:
    try:
        summary = summarizer(text, max_length=max_len, min_length=100, do_sample=False)
        with open('parsed_'+str(counter[0])+'.txt', 'w') as f:
            f.write(text)
        counter[0] += 1  # 修改列表元素,无需global
        return summary[0]["summary_text"]
    except IndexError as ex:
        logging.warning("Sequence length too large for model, cutting text in half and calling again")
        return summarize_text(text=text[:(len(text) // 2)], max_len=max_len) +" "+ summarize_text(text=text[(len(text) // 2):], max_len=max_len)

方案对比

  • 方案1简单直接,适合小型脚本;但全局变量在复杂项目中易引发维护问题。
  • 方案2更符合Python编程习惯,避免全局变量带来的副作用,代码扩展性更强。

内容的提问来源于stack exchange,提问作者Furkan Gözükara

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 17:31:00