为什么python中允许浮点切片(slice(0,1,0.1)),但调用index方法(slice(0,1,0.1).index)会引发TypeError?

为什么python中允许浮点切片(slice(0,1,0.1)),但调用index方法(slice(0,1,0.1).index)会引发TypeError?,python,slice,Python,Slice,示例:slice(0,1,0.1)在python 3.7.7中是可以的,但是slice(0,1,0.1)。索引(10)会引发类型错误 我想知道这种行为的潜在思维过程是什么。为什么可以构造浮点切片,但不能对其调用索引方法?索引的用例是什么 上下文:我理解浮点切片的用例——我自己也有一个。我正在实现一个对象,该对象表示由一组有限支撑点定义的任意维度的参数化分段线性函数。tl;drslice对象是由解释器在方括号表示法中使用它们时生成的,允许它们是任意的允许我们设计使用它们的代码。但是,由于内置列表依

示例:
slice(0,1,0.1)
在python 3.7.7中是可以的,但是
slice(0,1,0.1)。索引(10)
会引发
类型错误

我想知道这种行为的潜在思维过程是什么。为什么可以构造浮点切片,但不能对其调用
索引
方法?
索引的用例是什么


上下文:我理解浮点切片的用例——我自己也有一个。我正在实现一个对象,该对象表示由一组有限支撑点定义的任意维度的参数化分段线性函数。

tl;dr
slice
对象是由解释器在方括号表示法中使用它们时生成的,允许它们是任意的允许我们设计使用它们的代码。但是,由于内置列表依赖于
索引()
,因此该方法必须返回与列表兼容的值(即整数),如果不能返回,则会抛出错误


当你这样做的时候

my_obj[1:3:2]
解释器本质上把它翻译成

my_obj.__getitem__(slice(1, 3, 2))
这在使用列表时最为明显,列表在给定切片时具有特殊行为,但这种行为也适用于各种流行库中的其他数据类型(例如
numpy.array
pandas.Dataframe
)。这些类实现了它们自己的
\uuuu getitem\uuuu()
方法,这些方法有它们自己处理切片的特殊方法

现在,内置列表大概使用
slice.indexs()
将整个切片分解为一组单独的索引,它可以访问这些索引,然后将其分组并返回。列表索引只能是整数,它们不希望此功能中断,因此最一致的方法是使
slice.indexs()
在无法生成整数列表时抛出错误

但是,它们不能将
slice
限制为仅包含这些值,因为它是其他用户定义类可能希望使用的解释器生成的对象。如果您设计的对象如下所示:

class myGenerator:
    def __getitem__(self, s):  # s is a slice
        def gen():
            i = s.start
            while i < s.stop:
                yield i
                i += s.step
        return list(gen())

h = myGenerator()
print(h[1:4:.25])
# [1, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0, 3.25, 3.5, 3.75]
print(h[0:1:0.1])
# [0, 0.1, 0.2, 0.30000000000000004, 0.4, 0.5, 0.6, 0.7, 0.7999999999999999, 0.8999999999999999, 0.9999999999999999]
类myGenerator:
定义(self,s):#s是一个切片
def gen():
i=s.start
当我停下来时:
产量一
i+=s阶跃
返回列表(gen())
h=myGenerator()
打印(h[1:4:.25])
# [1, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0, 3.25, 3.5, 3.75]
打印(h[0:1:0.1])
# [0, 0.1, 0.2, 0.30000000000000004, 0.4, 0.5, 0.6, 0.7, 0.7999999999999999, 0.8999999999999999, 0.9999999999999999]
然后,它可以选择切片表示法以它想要的方式工作,所以我们可以为它建立自定义行为。但是如果我们将
slice.index()
改为使用它,那么它将破坏内置的
列表
——因此,python不允许我们这样做



*从技术上讲,对于许多内置程序,python解释器可能会采用快捷方式并执行硬编码例程,而不是将符号转换为函数调用并执行它们。但就我们的目的而言,这种类比已经足够好了,因为它确实适用于用户生成的对象。

使用浮点数作为步进数是个坏主意,因为浮点数的二进制表示存在错误,除非浮点数恰好是2的幂,而0.1不是。最好使用整数范围和步长,然后在需要计算的地方进行除法。@juanpa.arrivillaga我认为@title只有在该人已经对他们提出的问题做出贡献(据我所知)的情况下才有效。他们删除了他们的评论。@blhsing是的,这是我的假设,开发人员只是不想在浮点切片的棘手方面采取立场。请注意,
numpy
确实实现了此功能,因此可以实现此功能,当然,出于您的原因,这里有一些警告described@blhsing我知道在这种情况下,一个是受浮点精度限制的;另一方面,切片似乎很适合评估实数定义的函数,例如
y=x
。能够执行
y[0:1:0.1]
来评估
0,0.1,0.2,
处的函数似乎比使用循环更干净。您是否知道为什么检查切片是否与
列表
兼容是在
切片中进行的。索引
而不是在
列表中。\uu getitem\uuuu
直接进行的?@FirefoxMetzger我不知道,我不确定是否有文档可以找到具体的细节,但如果我不得不猜测的话,这将是为了尝试将
列表
子类化的人。而
slice
由于解释器处理它的方式,很难有效地进行子类化。