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
相关产品推荐
相关产品推荐

