UnboundLocalError报错咨询:局部变量state未赋值即引用
解决UnboundLocalError: local variable 'state' referenced before assignment的问题
嘿,我来帮你搞明白这个报错到底咋回事~
首先,这个报错的核心意思是:你在函数里用到了局部变量state,但在你用它的那个时刻,这个变量还没被赋值过。
结合你贴的代码片段来看,你的逻辑大概是这样的:
- 遇到带
[edit]的行,就把这一行的内容去掉[edit]后赋值给state(也就是记录当前州名) - 遇到带
(的行,就提取城镇名,然后把state和城镇名一起加入列表
但这里有两个容易踩坑的地方:
state的初始化缺失:如果文件里的某一行是城镇行,但在它之前没有任何一行触发过state = line[:-6]这个赋值操作(比如文件开头直接就是城镇行,或者中间有不符合条件的行跳过了state赋值),那当你要把state和town一起添加的时候,state还没被定义,直接引用就会触发这个报错。line.rstrip()没生效:字符串是不可变类型,你直接调用line.rstrip()不会改变原变量,得把处理后的结果赋值回去,不然行尾的换行符会干扰你判断line[-6:]=="[edit]"(比如行尾有换行的话,最后6个字符就不是[edit]了)
修复方案
给你调整后的代码示例,解决这两个问题:
def get_list_of_university_towns(): with open("university_towns.txt") as townfile: unitowns = townfile.readlines() town_list = [] state = "" # 先初始化state变量,避免未赋值就引用 for line in unitowns: line = line.rstrip() # 把处理后的行赋值回去,去掉末尾的换行和空格 if line.endswith("[edit]"): # 去掉[edit]后再strip一下,避免州名前后有多余空格 state = line[:-6].strip() elif ' (' in line: # 确保state已经有有效州名再添加 if state: town = line[:line.index("(")-1].strip() town_list.append([state, town]) return town_list
为啥这样能解决问题?
- 一开始就初始化
state为空白字符串,彻底避免了“引用未赋值变量”的情况; - 加了
if state:的判断,确保只有当我们已经获取到有效的州名时,才会把城镇信息加入列表,不会混入无效的空州名; - 修复了
line.rstrip()的赋值问题,让行尾的判断更准确。
内容的提问来源于stack exchange,提问作者Chunxiao Li
相关产品推荐
相关产品推荐

