在python中筛选字符串列表
对于赋值,我必须过滤列表,而不使用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
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)