asf*_*man 2 python scope list filter
我有以下方法:
def instances(candidate, candidates):
count = candidates.count(candidate)
# Removing candidate from candidates. #
list(filter(candidate.__ne__, candidates))
return {candidate: count}
Run Code Online (Sandbox Code Playgroud)
其预期目的是查找列表中某个元素的实例数,从列表中删除这些实例,并返回 Key:Value表示该元素及其实例数的对。
因此,如果我创建一个列表并调用该函数,它应该执行以下操作:
>>> someList = [1, 1, 1, 2, 3]
>>> print(instances(1, someList))
{1: 3}
>>> print(someList)
[2, 3]
Run Code Online (Sandbox Code Playgroud)
然而,对于最后一行,我得到的是:
>>> print(someList)
[1, 1, 1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
该行list(filter(candidate.__ne__, candidates))返回我想要的正确列表,但它似乎只存在于函数的范围内。如果我修改这一行来代替 read candidates = list(filter(candidate.__ne__, candidates)),由于某种原因,candidates它会被解释为函数范围内的局部变量。我不能简单地返回列表过滤器,因为我需要Key:Value为程序的另一部分返回该对。
我发现很奇怪的是,candidates在这一行中被解释为局部变量,而就在其上方,对的引用candidates被解释为函数的参数。
有人可以帮我理解为什么会发生这种情况吗?如果可能的话,建议一个符合预期目的的解决方案?谢谢!
我觉得很奇怪,候选人在这一行中被解释为局部变量,而就在其上方,对候选人的引用被解释为函数的参数。
Python没有引用。它有变量。 foo = bar意思是“使变量foo指向任何bar点”。重新分配变量只是重新定位指针。它不允许您更改指向给定值的“其他”变量。使用相同的方法传递参数:创建一个指向对象的新指针。因此不直接支持三星级节目
就地修改列表是通过切片语法完成的。你可以这样做:
candidates[:] = filter(candidate.__ne__, candidates)
Run Code Online (Sandbox Code Playgroud)