python TypeError:'NoneType'

时间:2014-10-26 11:52:55

标签: python

以下代码在第6行返回错误类型:TypeError:' NoneType'对象不可订阅

有什么问题?

def insertAtList(name, score, H):
    E = [score, name]
    i = len(H) - 1
    if H[i] != None:
        print("fail")
    while H[i-1][0] < E[0] or H[i-1] == None:
        H[i] = H[i-1]
        i -= 1
    H[i] = E
    for c in range (0,len(H) - 1):
        print(H[c])

def testq4():
    H = [[940, "Mike"], [880, "Rob"], [830, "Jill"], [790, "Paul"],
        [750, "Anna"], [660, "Rose"], [650, "Jack"], None, None, None]
    insertAtList("Mark",675,H)

testq4()

2 个答案:

答案 0 :(得分:2)

您需要在while循环条件中交换操作数的顺序。 or从左到右检查条件,并在找到一个True值时停止评估。当您发现H[i-1]None时,您就会想要这样做。目前,如果H[i-1]None,您仍在尝试评估不存在的H[i-1][0]

试试这样:

# ...
if H[i] is not None:
    print("fail")
while H[i-1] is None or H[i-1][0] < E[0]:
    H[i] = H[i-1]
    i -= 1
# ...

答案 1 :(得分:1)

错误信息非常清楚。您正在访问无值,尝试将其视为列表。这样做的原因是你首先尝试&amp;在之前以方式访问它,如果它是None,则进行测试。所以你需要在while循环中恢复你的条件。最重要的是,使用!=或==运算符不能检查None,但&#34;是&#34;并且&#34;不是&#34;运算符,因为None是单例。最后但同样重要的是,您应该考虑使用利用列表排序的内置功能的代码替换您的代码:

 def insertAtList(name, score, highscores):
     highscores.append([score, name])
     highscores.sort(key=lambda entry: 0 if entry is None else entry, reverse=True)



 H = [[940, "Mike"], [880, "Rob"], [830, "Jill"], [790, "Paul"],
         [750, "Anna"], [660, "Rose"], [650, "Jack"], None, None, None]
 insertAtList("Mark",675,H)
 print H