首页 > 解决方案 > 名称列表非定义

问题描述

当我运行此代码时,我收到错误“NameError: name 'w' is not defined”

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 行时。

标签: python

解决方案


因为您del w在其中一个分支中,所以会删除变量本身,因此如果在任何不是最后一次的迭代中采用该分支,则下一次迭代将通过尝试在未定义w.append的 a 上中断,或者因为您w再试del w 一次

一半的程序真的没有意义,你正在迭代,q但你没有使用结果,而是在删除前者之前分配w给(你的迭代变量)?s

  • s和 是一样的q[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('.')

推荐阅读