“在赋值之前引用的局部变量''错误。我该如何解决?

时间:2014-06-18 15:03:34

标签: python

我正在尝试创建一个列表,该列表接收数字并删除列表中的所有旧数字并返回结果,但它一直给我错误"本地变量'&#39 ;在转让前引用"我该如何解决?

def purify(lst):
    for item in lst:
        if item%2 != 0:
            lst.remove(item)
    s.append(lst)
    s = []
    return s

4 个答案:

答案 0 :(得分:1)

您需要先将s分配给空列表然后追加。

   def purify(lst):
        for item in lst:
            if item%2 != 0:
                lst.remove(item)
        s = []
        s.append(lst)

        return s

正如@jonrsharpe建议的那样,在迭代列表时不要删除该项目。好的方法是使用列表理解

[i for i in lst if i%2!=0]

答案 1 :(得分:1)

目前尚不清楚为什么要返回包含单个列表的列表。为什么不返回“纯化”清单?

def purify(lst):
    return [item for item in lst if item % 2 == 0]

这使用list comprehension。演示:

>>> purify([1, 2, 3, 4, 5])
[2, 4]

为了获得更大的灵活性,您还可以制作一个传递自己规则的版本:

def purify(lst, rule):
    return [item for item in lst if rule(item)]

演示:

>>> purify([1, 2, 3, 4, 5], lambda i: i % 2)
[1, 3, 5]

答案 2 :(得分:0)

迭代时不应删除项目,因为在使用迭代器时不应更改列表(这是您使用“in”执行的操作)。

def purify(lst):
    s = []
    for item in lst:
        if item%2 == 0:
            s += [item]  
    return s

btw:这可以用numpy快速完成。

import numpy as np
...
def purify(lst):
     indices = np.where(np.mod(lst,2) == 0)
     return np.array(lst)[indices]

答案 3 :(得分:0)

使用过滤器简化您的生活:

filter(lambda x: x % 2 == 0, range(5))