Skip to main content
 首页 » 编程设计

python之在 python 中使用列表时遇到问题

2025年05月04日33lori

函数 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):