【问题标题】:What are the default values set to in a slice?切片中设置的默认值是什么?
【发布时间】:2017-08-14 20:48:19
【问题描述】:

我查看了 why-does-list-1-not-equal-listlenlist-1what-are-the-default-slice-indices-in-python-really 上的热门答案,以了解切片中的默认值设置。两个最佳答案均参考以下文档:

给定s[i:j:k]

如果 i 或 j 被省略或没有,它们将成为“结束”值(结束取决于 k 的符号)。注意,k 不能为零。如果 k 为 None,则将其视为 1。

假设我有以下代码:

s = "hello"
forward_s = s[::1]
print(forward_s) # => "hello"

backward_s = s[::-1]
print(backward_s) # => "olleh"

我知道如果省略了索引,那么 Python 会将其视为在这些地方使用了 None 的值。根据文档,[i:j:k] 中的ij 的索引根据k 的符号设置为“结束”值。对于肯定的k,我假设i 设置为0j 设置为字符串的长度。但是,为负 k 设置的值是什么?

例如,以下也反转字符串:

reversed_str = s[-1:-6:-1]

所以当k = -1 时,i 的默认值可能设置为-1j 设置为-len(s) - 1

【问题讨论】:

  • 这似乎是正确的分析。否则它会尝试从 0 到 -1 到 -2...所以[::-1] 不会正确地反转列表,而是会给出第一个元素,然后将其余元素反转。
  • 什么是“最终价值”?
  • 当 k 为负数时,i 和 j 被视为从字符串的终止端开始的结束值。您链接的答案中引用的文档对此很明确。
  • 好吧,如果len(str) - 10 是“最终值”,那么为什么这不起作用:"hello"[len("hello") - 1: 0: -1]?这将返回“olle”而不是“olleh”。
  • 这就是我想澄清的。 -1-len(s) - 1 是否是另一组结束值,特别是对于负值 k。

标签: python python-3.x


【解决方案1】:

default valuesNoneNoneNone

class Sliceable(object):
    def __getitem__(self, slice):
        print(slice)

Sliceable()[::]
>>> slice(None, None, None)

这与slice() 确实需要stop 参数无关。库文档对此没有那么明确,但C API makes clear,所有三个值都可能为空:

startstopstep参数用作同名切片对象属性的值。任何值都可以是NULL,在这种情况下,None 将用于相应的属性。

由可切片对象来理解默认值。惯例是使用第一个元素,过去最后一个元素,内置集合实现的最小步进:

l = [1, 2, 3]
l[slice(None, None, None])
>>> [1, 2, 3]
s[None:None:None])
>>> [1, 2, 3]

负步进将导致默认的startend 值在语义上反转,即:

s = 'abc'
s[slice(None, None, -1)]
>>> 'cba'
s[::-1]
>>> 'cba'

请注意,这并不意味着简单的值翻转,end 的默认值通常是“序列末尾的一个,在任何方向上”,因为range() 不是包含结束值,但切片的默认值应包含完整序列。

这是记录在here

s[i:j:k]

s 的切片从ij 的步长为k 被定义为索引为x = i + n*k 的项目序列,使得0 <= n < (j-i)/k。换句话说,索引是i, i+k, i+2*k, i+3*k 等等,当达到j 时停止(但从不包括j)。当k 为正时,ij 如果更大,则减少为len(s)。当k 为负数时,如果ij 更大,则将它们减少为len(s) - 1。如果ij 被省略或无,它们将成为“结束”值(结束取决于k 的符号)。请注意,k 不能为零。如果kNone,则将其视为1

【讨论】:

  • 这里的None 是什么意思:"foo"[None:None:-1]?所以我假设的第一个 None 意味着字符串中的最后一个字符。现在第二个 None 翻译成什么?
  • 第二个None 是否解释为-len(s) - 1s 是有问题的字符串。
  • @AsadMoosvi 如前所述:对于内置集合c(以及任何模仿此类的对象),None 作为end 参数被解释为len(s)),传递给的实际值__getitem__() 仍然是 None。请注意,切片范围是唯一的。
  • 但这没有意义。如果end 参数是-1 那么start 参数是什么?用于反转字符串?
  • @AsadMoosvi 对不起,错字,当然是len(s)(-1 是len(s) - 1)。而start就是None,被解释为0
猜你喜欢
  • 2020-09-01
  • 2012-09-13
  • 2019-02-04
  • 1970-01-01
  • 2015-08-19
  • 2011-05-16
  • 2022-07-01
  • 2022-10-15
  • 1970-01-01
相关资源
最近更新 更多