Python程序调试求助:NameError: name 'lines' is not defined错误排查
嘿,我来帮你排查这个NameError问题!从你给出的报错信息来看,问题确实出在lines变量的作用域或者初始化上,咱们一步步来解决。
先把你的报错信息贴出来方便分析:
NameError Traceback (most recent call last)
in ()
16 csvreader = csv.reader(csvfile)
17 for line in csvreader:
---> 18 lines.append(line)
19 return lines
20 def loadDatasetFinal(filename, split, trainingSet = [], testSet = ...
问题根源
你提到已经把lines声明为数组了,但大概率是在函数外部声明的,或者当前函数内部根本没初始化这个变量。Python里有严格的作用域规则:如果在函数里直接修改一个未声明的变量,会默认把它当成局部变量处理;如果这个局部变量之前没被定义过,就会抛出NameError。
举个和你当前情况一致的反例:
lines = [] # 在函数外部声明的变量 def loadCsv(filename): with open(filename, 'r') as csvfile: csvreader = csv.reader(csvfile) for line in csvreader: lines.append(line) # 这里会报错,函数内没声明要使用外部的lines return lines
修复方案
这里有两种靠谱的解决方式,优先推荐第一种(更符合Python的函数设计规范):
方案1:在函数内部初始化lines数组
把lines的定义放在函数内部,让它成为函数的局部变量,这样作用域完全没问题:
import csv def loadCsv(filename): lines = [] # 在这里初始化数组,确保函数内可以正常访问 with open(filename, 'r') as csvfile: csvreader = csv.reader(csvfile) for line in csvreader: lines.append(line) return lines # 调用示例 dataset = loadCsv('your_dataset.csv')
方案2:使用global声明(不推荐,除非特殊需求)
如果你确实需要复用外部的lines变量,可以在函数里用global声明它,告诉Python这是一个全局变量:
import csv lines = [] # 全局变量 def loadCsv(filename): global lines # 声明要使用全局的lines变量 with open(filename, 'r') as csvfile: csvreader = csv.reader(csvfile) for line in csvreader: lines.append(line) return lines
不过这种方式会让函数依赖全局变量,代码的可维护性和复用性会变差,所以优先选方案1。
另外,从你后面的代码片段def loadDatasetFinal(filename, split, trainingSet = [], testSet = ...来看,你应该是在做数据集拆分的工作,记得确保每个函数里的变量都在正确的作用域内初始化哦!
内容的提问来源于stack exchange,提问作者Chu

