使用列表作为操作数
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
就可以了。
我 运行 在将列表传递给函数时遇到了问题。它似乎对列表变量有全局影响,但我没有在我的函数中将其声明为全局。谁能告诉我发生了什么以及如何解决它?
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
就可以了。