列表对象的索引索引不接受可选参数开始

问题描述 投票:0回答:2

我有包含一些可重复元素的列表。我想从特定位置(而不是从开始)开始查找元素的索引。所以我在列表对象上使用了索引方法。根据文档,它具有可选参数start和stop。

我使用的代码示例:

lst = [5, 1, 2, 3, 4, 5, 6, 7]
index_5 = lst.index(5, start=2)
print(index_5)

并且当我运行这段代码时,我得到了例外,索引方法没有参数start。可能是什么问题?

Traceback (most recent call last):
  File "D:/Misc.py", line 2, in <module>
    index_5 = lst.index(5, start=2)
TypeError: index() takes no keyword arguments

作为解决方法,我可以在下面做一些技巧,但是如果有使用语言功能的方法,我希望使用它。

index_5 = lst[2:].index(5) + 2
python python-3.x list indexof
2个回答
0
投票

根据documentationindex,参数start仅缩小搜索空间:

可选参数start和end的解释方式如下:符号,用于将搜索范围限制为特定子序列列表中。返回的索引是相对于开头计算的完整序列而不是起始参数。

错误旁边说没有keyword参数,因此您应该使用positional参数。


0
投票

但是builtins.py中的签名被指定为def index(self,value,start = None,stop = None),所以我希望它被命名为parameter。

参见此answer。它说:

由于Python C级API的开发方式,许多内置函数和方法实际上没有为其参数指定名称。即使文档将参数default调用,该函数也不会将名称default视为引用了可选的第二个参数。您必须按位置提供参数。

该文档以前在仅位置参数方面很差,但是在现代Python上,它们正在改进。关键信息是看似不正确的/在签名中:

index(value, start=0, stop=9223372036854775807, /)
                                                ^ This is not a typo!

这意味着正斜杠之前的所有参数仅是位置参数,不能通过关键字传递。

函数的参数列表中的斜杠表示该函数之前的参数仅是位置参数。仅位置参数是没有外部可用名称的参数。在调用仅接受位置参数的函数时,参数将仅基于其位置映射到参数。

尝试一下:

lst.index(5,2)

作为解释,this也可以解释:

许多内置函数仅使用METH_VARARGS,这意味着它们不支持关键字参数。 “ len”甚至更简单,并使用选项METH_O表示它将单个对象作为参数。这使代码非常简单,并且可能也会对性能造成轻微影响。

© www.soinside.com 2019 - 2024. All rights reserved.