Python - 为什么我的列表没有在此方法的范围之外进行修改?我如何修改我的代码,使其成为这样?

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被解释为函数的参数。

有人可以帮我理解为什么会发生这种情况吗?如果可能的话,建议一个符合预期目的的解决方案?谢谢!

Kev*_*vin 5

我觉得很奇怪,候选人在这一行中被解释为局部变量,而就在其上方,对候选人的引用被解释为函数的参数。

Python没有引用。它有变量。 foo = bar意思是“使变量foo指向任何bar点”。重新分配变量只是重新定位指针。它不允许您更改指向给定值的“其他”变量。使用相同的方法传递参数:创建一个指向对象的新指针。因此不直接支持三星级节目

就地修改列表是通过切片语法完成的。你可以这样做:

candidates[:] = filter(candidate.__ne__, candidates)
Run Code Online (Sandbox Code Playgroud)