在python

时间:2015-07-11 12:49:08

标签: python list python-2.7

对于作业,我必须在不使用Python内置函数的情况下过滤列表。这是我的代码:

def satisfiesF(L):
    result = 0
    i = 0
    L1 = []
    while i < len(L):
        s = L[i]
        if f(s) == True :
            result += 1
            L1.append(L[i])
        i += 1
    L = L1
    print L
    return result
def f(s):
    return 'a' in s
L = ['a', 'b', 'a']
print satisfiesF(L)
print L

打印:

['a', 'a']
2
['a', 'b', 'a']

为什么第二个L与第一个不一样?我搜索了几个小时,但我无法理解。在我看来,这里L是通过引用传递的,为什么值不变?

我已尝试更改L = L1中的行L = list(L1),但结果是一样的。

3 个答案:

答案 0 :(得分:0)

这是局部和全局变量范围的一个简单错误。

在您的函数satisfiesF(L)内部

L = L1

将传递给函数L的函数内声明的satisfiesF()更改为参数。您可以通过L'并尝试打印L',它可以正常工作。但print L会出现variable out of scope错误。

但是当你做的时候

print L

在最后一行,它会在L

之上打印L = ['a', 'b', 'a']仅在其上方两行宣布

答案 1 :(得分:0)

正如Himanshu指出的那样,范围就是问题所在。这就是为什么这样做的原因,因为它设置了self.L

class my_test:
    def __init__(self, values, check):
        self.L = values
        self.check = check

    def run_test(self):
        print self.satisfiesF()
        print self.L

    def f(self, s):
        return self.check in s

    def satisfiesF(self):
        result = 0
        i = 0
        L1 = []
        while i < len(self.L):
            s = self.L[i]
            if self.f(s) == True :
                result += 1
                L1.append(self.L[i])
            i += 1
        self.L = L1
        print self.L
        return result

x = my_test(['a', 'b', 'a'], 'a')
x.run_test()

输出

['a', 'a']
2
['a', 'a']

答案 2 :(得分:0)

L = L1

这使L引用了L1引用的列表。在此行之前和之后添加print(id(L)),您可以看到其id已更改。

在获取L内容时保持id相同L1的一种方法是首先清除它然后追加:

del L[:]
L.append(L1)