涉及“AttributeError: 'NoneType' 对象没有 'append' 属性”的奇怪错误

1 投票
2 回答
2392 浏览
提问于 2025-04-17 16:54

我正在尝试处理一个文本文件,把它转换成一个列表,然后根据空格把列表中的每一项分开。

我创建了一个测试变量,想单独运行这部分代码。我的代码在spyder编辑器里是这样的:

test = ['NC_009142.1_03_012_002_001 560', 'NC_017586.1_13_009_003_001 555', 'NC_016111.1_13_010_003_001 555']
ListOfLinesParsed = test

PN_List = []
counter_iterative = 0
while counter_iterative < len(ListOfLinesParsed):
    PN_List = PN_List.append(ListOfLinesParsed[counter_iterative].split()[0])
    counter_iterative += 1

print PN_List

但是这段代码返回了一个错误:

runfile(r'/home/jake/.spyder2/.temp.py', wdir=r'/home/jake/.spyder2')

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

  File "/usr/lib/python2.7/dist-
packages/spyderlib/widgets/externalshell/sitecustomize.py", line 493, in runfile

    execfile(filename, namespace)
  File "/home/jake/.spyder2/.temp.py", line 7, in <module>

    PN_List = PN_List.append(ListOfLinesParsed[counter_iterative].split()[0])

AttributeError: 'NoneType' object has no attribute 'append'

但是如果我直接在终端输入这些命令,就没有错误:

testL = []

testL.append(test[0].split()[0])

testL

['NC_009142.1_03_012_002_001']

testL.append(test[1].split()[0])

testL

['NC_009142.1_03_012_002_001', 'NC_017586.1_13_009_003_001']

testL.append(test[2].split()[0])

testL

['NC_009142.1_03_012_002_001', 'NC_017586.1_13_009_003_001', 'NC_016111.1_13_010_003_001']

难道这两种情况不应该完全一样吗?我不明白为什么我脚本里的代码和终端命令的表现会有差别。

2 个回答

0
PN_List = PN_List.append(ListOfLinesParsed[counter_iterative].split()[0])

这里的问题在于,.append()这个方法会返回None,而你把列表保存到了这个NoneType的值里。这样在第二次循环的时候,就会出错,因为你试图在一个NoneType上使用.append()。这也是为什么在控制台中没有报错,因为这个问题只在你第二次使用上面那行代码的时候出现。

所以,简单来说,你可以这样做:

PN_List.append(ListOfLinesParsed[counter_iterative].split()[0])
6

这一行

PN_List = PN_List.append(ListOfLinesParsed[counter_iterative].split()[0])

就是问题所在。

list.append 是一个 就地操作,它会返回 None,但会直接改变原来的列表。如果你把 PN_List 赋值为这个结果,它就变成了 None。如果你不这样做,你的程序就会正常运行。这就是为什么当你尝试在没有赋值的情况下添加内容时,能得到预期的结果。

撰写回答