无定义名称列表

2024-09-30 16:39:11 发布

您现在位置:Python中文网/ 问答频道 /正文

运行此代码时,出现错误“NameError:name'w'未定义”

q = open("programma", "r")
q = q.read()
time.sleep(0.5)
print("estrapolazione programma")
a = -1
s = 0
w = [""]
par = [""]
for s in q:
  a += 1
  if q[a] == ".":
    s = w
    par.append("".join(s))
    del w
  else:
    w.append(q[a])
print(par)

我不明白为什么它告诉我w没有在w.append(q[a])中定义,而它是在上面9行定义的


Tags: 代码nameread定义time错误sleepopen
2条回答

如果要清除列表w而不是del w,可以使用w.clear()

del w删除列表,您必须创建列表的新实例才能使用它。其中asw.clear()清除列表,但不删除列表,可以再次使用

因为您在其中一个分支中del w,这会删除变量本身,因此如果该分支在任何不是最后一个的迭代中执行,那么下一个迭代将通过尝试在未定义的ww.append或者因为您再次尝试del w,而中断

一半的程序实际上没有意义,你在q上迭代,但是你没有使用结果,而是在删除前者之前将w赋值给s(你的迭代变量)

  • sq[a]相同,因此您不需要a,只需直接使用s,并且通常不需要初始化循环变量,也不应该对其进行签名
  • 如果您想清除w,可以直接使用w.clear()del w[:]
  • 或者,您可以将一个新的空列表分配给它w = [],这并不重要,但在某些情况下确实如此
  • 顺便说一句,我不认为将w初始化为包含空字符串的列表有什么意义,因为您正在连接一个空字符串"".join([])"".join([''])具有相同的结果,并且从不测试它是否为空
  • 虽然在这里这并不重要,但在使用文件后关闭它们也是一种很好的做法,当使用“文本模式”文件IO来明确指定编码时

以下是一些清理工作:

with open('programma', 'r', encoding='utf-8') as f:
    contents = f.read()

time.sleep(0.5)
print("estrapolazione programma")

word = []
par = []
for char in contents:
    if char == '.':
        par.append(''.join(word))
        word = [] # or w.clear()
    else:
        word.append(char)
print(par)

顺便说一句,整个事情都可以写下来

par = contents.split('.')

相关问题 更多 >