Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中筛选字符串列表_Python_List_Python 2.7 - Fatal编程技术网

在python中筛选字符串列表

在python中筛选字符串列表,python,list,python-2.7,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

对于赋值,我必须过滤列表,而不使用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
为什么第二个L和第一个不一样?我找了好几个小时了,但我不明白。在我看来,这里L是通过引用传递的,为什么值不改变呢


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

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

函数内部
满足f(L)

L = L1
更改函数中声明的
L
,该函数作为参数传递给函数
satisfiesF()
。您可以通过
L'
并尝试打印
L'
,这样就可以了。但是
printl
将给出
变量超出范围的错误

但当你这么做的时候

print L

在最后一行,它将打印
L
声明,仅在其上方两行,作为
L=['a','b','a']

,正如希曼苏指出的,范围就是问题所在。这就是为什么这样做,因为它设置了
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()
这使得
L
引用了
L1
引用的列表。在此行前后添加
print(id(L))
,您可以看到其
id
已更改

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

del L[:]
L.append(L1)

我明白,但我该如何避免呢?我如何改变我的身份?我刚刚发现“Python语言中的所有参数(参数)都是通过引用传递的。这意味着,如果您更改了函数中参数的引用,那么更改也会反映在调用函数中。”()您可以通过在顶层声明L(您已经这样做)并将不同的名称传递给您的函数来更改L,说
L'
并从函数内部更改L的值即可完成此任务。或者,您不需要传递任何全局声明的参数。我必须将其作为参数传递,我无法更改签名。我不明白你第二句话的意思。您可以再解释一下吗?您只需将函数定义为
def satisfiesF():
当您从全局范围更改变量时。我理解您所做的,但这对我没有帮助,因为正如我所说,我必须作为赋值的一部分来执行此操作,我只能修改满足感,而不能修改其余部分。当我尝试您的代码时,我出现了一个错误,错误是:“list”对象在Q中没有属性“L”,听起来像是您编写的函数,并且未修改/重新编写现有函数。不知道你为什么会出错,我没有。您可以始终返回
L
而不是
result
,或者返回
[L,result]
,然后对其进行排序
['a', 'a']
2
['a', 'a']
L = L1
del L[:]
L.append(L1)