函数 satisfiesF() 以字符串列表 L 作为参数。函数 f 接受一个字符串作为参数,返回 true 或 false。函数满足 F() 修改 L 以仅包含 f(s) 返回 true 的那些字符串 s。 我有两个旨在产生相同输出的不同程序。但是我得到了不同的输出。
第一个程序:
def f(s):
return 'a' in s
def satisfiesF(L):
k=[]
for i in L:
if f(i)==True:
k.append(i)
L=k
print L
print
return len(L)
L = ['a', 'b', 'a']
print satisfiesF(L)
print L
输出:
['一个', '一个']
2
['a', 'b', 'a']
第二个程序:
def f(s):
return 'a' in s
def satisfiesF(L):
for i in L:
if f(i)==False:
L.remove(i)
print L
print
return len(L)
L = ['a', 'b', 'a']
print satisfiesF(L)
print L
输出:
['一个', '一个']
2
['一个', '一个']
请解释为什么它们给出不同的输出。
请您参考如下方法:
在你的第二个函数中,你看到 2 作为长度,L 中的所有元素都在函数之外,因为你正在设置一个局部变量 L 是对 k 的引用,您在函数外部创建的 L 不受影响。要查看 L 中的变化,您需要使用 L[:] = k,然后打印 L 将为您提供 [' a', 'a'] 在函数外部,因为您正在更改传入函数的原始列表对象 L 列表。
首先,您直接修改 L,因此您可以在函数外部看到 L 中的更改。
也永远不要遍历要从中删除元素的列表,如果你 L = ['a', 'b', 'a','a','d','e','a'],您将获得意想不到的行为。复制 for i in L[:] 或使用 reversed for i in reversed(L):
