使用列表作为操作数

Using list as operand

我 运行 在将列表传递给函数时遇到了问题。它似乎对列表变量有全局影响,但我没有在我的函数中将其声明为全局。谁能告诉我发生了什么以及如何解决它?

def a_Minus_b(a,b):
    for i in range(len(b)):
        print("a= ", a)
        if b[i] in a:
            a.remove(b[i])
    return a

x = [1,2,3,4]
a_Minus_b(x,x)
a=  [1, 2, 3, 4]
a=  [2, 3, 4]
a=  [2, 4]

错误:

Traceback (most recent call last):
  File "<pyshell#115>", line 1, in <module>
    a_Minus_b(x,x)
  File "<pyshell#112>", line 4, in a_Minus_b
    if b[i] in a:
IndexError: list index out of range

Python 函数可以改变它们的参数,如果参数本身是可变的并且 python 列表是可变的。

如果你想让你的功能没有副作用,先复制数据。

def a_minus_b(a, b):
    a = list(a) # makes a copy and assigns the copy to a new *local* variable
    for val in b:
        print("a = ", a)
        if val in a:
            a.remove(val)
    return a

而不是

a = list(a)

您可以使用以下任何一种:

from copy import copy, deepcopy


a = a[:]         # copies only the references in the list
a = a.copy()     # copies only the references in the list
a = copy(a)      # copies only the references in the list
a = deepcopy(a)  # creates copies also of the items in the list

此外,您正在做的是 python 中内置的,它是 filter 函数。 它接受一个可迭代对象和一个函数,并且 returns 仅接受函数计算结果为 True.

的可迭代对象的元素
print(list(filter(a, lambda elem: elem in b))

filter returns一个迭代器,把它转换成一个列表,调用list就可以了。