Python执行List.append(int)后列表变NoneType无法调用count方法
问题说明
执行列表操作代码时,energies列表在运行过程中变为NoneType,触发报错:无法在NoneType对象上调用count()方法,原始代码如下:
import random Energy = 500 energies = [-2, -1] Hydrogen = 0 numoep = 0 Eposfind = 0 sethydrogen = 0 times = 0 #Scene setting# while numoep < 500: energies.append(random.randint(1, 100)) numoep = numoep + 1 try: energies.remove(-2) energies.remove(-1) except: pass while Eposfind < 100: if energies.count(Eposfind) != 1: sethydrogen = energies.count(Eposfind) Hydrogen = Hydrogen + sethydrogen Energy = Energy - 2 * (sethydrogen) try: energies = energies.remove(Eposfind) except ValueError: pass print(Eposfind) Eposfind = Eposfind + 1 print("finished")
错误原因
- 核心逻辑错误:Python列表的
remove()方法是原地修改列表的方法,执行后不会返回修改后的列表,返回值固定为None。代码中写了energies = energies.remove(Eposfind),第一次执行到这行时,就会把原本存储的列表对象覆盖成None,下一轮循环调用energies.count()时就会触发NoneType相关报错。 - 语法格式错误:Python靠缩进识别代码层级,原始代码中
try/except块、if判断块、循环内部的代码没有正确缩进,直接运行会先抛出缩进错误。 - 冗余逻辑问题:初始列表里的
-2、-1只会存在一次,放在填充500个随机数的循环里反复尝试删除,除了第一次会成功,剩下499次都会触发值不存在的错误,完全靠except静默跳过,属于无效执行。
修复方案
- 去掉
remove()调用前的变量赋值,直接执行energies.remove(Eposfind)即可,不需要接收返回值 - 补全所有代码块的缩进,控制流语句下属的代码统一缩进4个空格
- 把删除初始
-2、-1的逻辑挪到填充随机数的循环外,避免无意义的异常捕获
修复后的可运行代码:
import random Energy = 500 energies = [-2, -1] Hydrogen = 0 numoep = 0 Eposfind = 0 sethydrogen = 0 times = 0 # 场景初始化 while numoep < 500: energies.append(random.randint(1, 100)) numoep = numoep + 1 # 初始标记值移出循环删除 energies.remove(-2) energies.remove(-1) while Eposfind < 100: if energies.count(Eposfind) != 1: sethydrogen = energies.count(Eposfind) Hydrogen = Hydrogen + sethydrogen Energy = Energy - 2 * (sethydrogen) try: # 直接调用remove方法,不要将返回值赋值给energies energies.remove(Eposfind) except ValueError: pass print(Eposfind) Eposfind = Eposfind + 1 print("finished")
内容的提问来源于stack exchange,提问作者Spock 360
相关产品推荐
相关产品推荐

