Python - “'NoneType'对象不可迭代”错误

时间:2014-08-15 21:20:16

标签: python list function

我在codecademy项目中的指示是

  

定义一个名为purify的函数,它接受一个数字列表,删除列表中的所有奇数,然后返回结果。例如,purify([1,2,3])应该返回[2]。不要直接修改您输入的列表;相反,返回一个只包含偶数的新列表。

我提出的代码是:

def purify(numbers):

pure = numbers

for num in pure:
    if num % 2 != 0:
        pure = pure.remove(num)

return pure

错误是:

  

哎呀,再试一次。您的函数在[1]上崩溃,因为您的函数会抛出一个"' NoneType'对象不可迭代"错误。

当我理解它时,这意味着我的代码中的某些内容将被返回为"无"。或者那里没有数据。我似乎无法找到这个简短的代码有什么问题,除非它在我的if语句中。提前谢谢。

所以我在代码中进行了编辑以删除" pure = pure.remove(num)"这解决了没有问题。但是,在运行代码时,它仍然无法输入[4,5,5,4]并返回[4,5,4]。

新守则:

def purify(numbers):

    pure = numbers

    for num in pure:
        if num % 2 != 0:
            pure.remove(num)

    return pure

4 个答案:

答案 0 :(得分:6)

第一个问题是您在迭代时更改列表。 DO NOT change lists while you are iterating over them.您将错过循环中的某些值。

第二个问题是list.remove就地行动并返回无。因此,当您执行pure = pure.remove(num)时,将pure设置为None,这不再是可迭代的,而这又是导致错误的原因。相反,您可以按如下方式过滤列表

def purify(numbers):
    return [num for num in numbers if num % 2 == 0]

答案 1 :(得分:2)

那个错误意味着python正在尝试迭代None对象。

代码中唯一的迭代就是for循环,因此pure必须是None

另外,不要忘记正确缩进:

def purify(numbers):

    pure = numbers

    for num in pure:
        if num % 2 != 0:
            pure = pure.remove(num)

    return pure

如果将None设置为numbers,或者从pure.remove(num)分配时,则将其定义为None。当您查找remove(num)文档时,您会看到它运行就地,因此它不会返回任何有用的内容(通常为pure =)。您要执行的操作会删除for循环中的{{1}}部分。你可能会注意到你最终跳过循环中的元素,但这会对这段代码产生一个单独的问题(修改你正在迭代的东西)。

答案 2 :(得分:0)

我不知道pure的类型是什么,但它似乎是一个可变对象。 pure.remove更新了pure,因此会返回None。您不应将其设置为pure。此外,您不应修改在迭代过程中迭代的对象。

编辑:我在此处放置的上一段代码不正确,如评论中所述。我建议你选择其他答案中提到的方法之一。如果您真的对维护当前解决方案的一般结构感兴趣,可以使用copy模块进行解决方法:

import copy

def purify(numbers):
    pure = copy.copy(numbers) # a shallow copy
    for num in numbers:
        if num % 2 != 0:
            pure.remove(num)

    return pure

请注意,numbers的类应该实现__copy__方法才能生效。您在上面的评论中提到numberslist,因此内置实现适合您。但是,对于list,您只需执行以下操作:

pure = numbers[:]

答案 3 :(得分:-2)

def purify(numbers):
    sequence = []     //starting with a an empty 
    for f in sequence:
        if f%2 -1:    //filtering out odd numbers,alternative to f%2 ==0
            sequence.append(f) //append each even number to the empty list
    return sequence

N / B:从空列表开始确保列表未被修改