对于作业,我必须在不使用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)
,但结果是一样的。
答案 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)