如何在切片中使用变量时使用单冒号?

6 投票
3 回答
2421 浏览
提问于 2025-04-17 15:05

我想用一个变量来存储一个切片表达式。以下是我尝试的代码:

    if variable is not None:
        var = variable
    elif self.__filter is not None:
        var = self.__filter
    else:
        # this doesn't work, : alone understandably gives a syntax error
        var = ':'

然后在这里使用这个变量:

return stuff[var]

我这样做是为了让我的代码结构更清晰。另一种方法是根据不同的情况返回这些表达式:

return stuff[variable]
return stuff[self.__filter]
return stuff[:]

出现了一个异常:ValueError: invalid literal for int() with base 10

有没有办法把冒号赋值给变量,这样它就可以在切片表达式中使用(比如转义或类似的操作),还是说我必须用var = slice(0, self.getNumberOfVariables())来代替呢?

附注:我在提问之前有搜索过,但没有找到类似的内容。如果我错过了重复的问题,抱歉。

3 个回答

-1

表达式 stuff[var] 是一种固定的方式,它把可能的选项限制在一个可以用单个变量表示的范围内。你需要考虑一下这些内容是怎么被理解的。

首先,代码会被解析。在这个过程中,会确定使用的语法。start:stop:step 是一种表达方式,编译器会把它当作切片来处理。其中 : 是一个特殊的情况。其他的可能性包括标量(单个值)、列表和切片对象。也就是单个对象。

在获取值的时候,如果使用 var,我只能把 var 设置为一个列表、一个标量或者一个切片对象。当我试图把带有冒号语法的内容赋值给 var 时,我得到的只是一个字符串字面量,而字符串字面量不会被获取器或设置器方法解析。简单来说,你不能通过给一个变量赋值来改变语法。

11

直接使用冒号是不行的。冒号是用来表示某种操作的符号;在Python中,通常不允许直接使用这种标点符号,而是需要用到一个函数(就像算术运算符和operator模块中的相应函数一样)。

我们需要用到的函数是内置的slice,它可以返回一个切片的明确表示。使用slice(None)可以包含所有内容。

下面是一个例子:

>>> s = slice(None)
>>> x = range(10)
>>> x[s]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
5

这是一篇旧帖子,但它在谷歌上刚好排在了前面,所以我想回答一下,以帮助其他人。

在切片中,冒号 : 只是用来分隔 [start:stop:step] 的。通常没有明确写出的是,当 startstopstep 使用默认值时,会用 None 来表示。

通过例子来看,这样更容易理解:

# Slice with all parameters specified
# start:1, stop:4, step:1    
seq[1:4:1]

# Slice with default step value (default=1)
# start:1, stop:4, step:1
# All the following are equivalent    
seq[1:4:None]
seq[1:4:]
seq[1:4]

# Slice with default stop value (default = len(seq))
# start:1, stop:len(seq), step:1
# All the following are equivalent    
seq[1:None:1]
seq[1::1]

# Slice with default step and stop value
# start:1, stop:len(seq), step:1
# All the following are equivalent    
seq[1:None:None]
seq[1::]
seq[1:]

# Slice with default start value
# start:1, stop:4, step:1
# All the following are equivalent    
seq[None:4:1]
seq[:4:1]

# Slice with all default values
# start:1, stop:len(seq), step:1
# All the following are equivalent    
seq[None:None:None]
seq[::]
seq[:]

所以,回答你的问题,使用切片变量中的 : 是没有意义的,因为你是在请求一个分隔符。不过这确实让人困惑,因为在直接创建切片时,你不需要明确写出 None,这就让 : 看起来像是一个操作符。

简单来说,当使用 slice 类型时,你必须明确写出 None。所以 seq[slice(None, None, None)]seq[::] 是等价的。

撰写回答