【问题标题】:What does the slice() function do in Python? (compared to slice notation) [duplicate]Python 中的 slice() 函数有什么作用? (与切片符号相比)[重复]
【发布时间】:2017-04-15 05:38:06
【问题描述】:

我想在the post 上评论已接受的同名答案,但我太绿了。

这个答案,“a[x:y:z] 给出的结果与 a[slice(x,y,z)] 相同”,在我的尝试中并没有被证明是正确的,所以我正在寻求对slice() 和切片表示法之间的区别。

我有一个串行协议,其消息正文如下:Q0134CA24B。

如果我想收集该协议的元素,这样做会非常好:

>>> str = 'Q0134CA24B'
>>> cmd = slice(0,1)
>>> str[cmd]
'Q'
>>> cs = slice(-2,0)
>>> str[cs]
''
>>> cs
slice(-2, 0, None)
>>> str[cs]
''
>>> str[-2:None:None]
'4B'

那么,我做错了什么?与切片表示法相比,切片()是否受到限制?这对我来说非常有用,因为我经常在串行协议中工作,并且使用 slice() 定义字符字段将是一种传递这种表示的 Python 方式。

【问题讨论】:

  • 我很难理解这个问题。声明“a[x:y:z] 给出与 a[slice(x,y,z)] 相同的结果”,在我的尝试中没有被证明是正确的”——我没有看到你演示的任何尝试这两者之间的不一致...
  • 您的所有测试都没有显示 a[x:y:z]a[slice(x, y, z)] 之间的差异。
  • 天哪,那个骗子也有完全相同的标题......这几乎就像你可以谷歌一样。
  • 你为什么期望slice(-2, 0) 表现得像[-2:][-2:] 等价于 slice(-2, None)
  • @SterlingArcher:发问者实际上确实找到了那个帖子。它链接在这个问题的第一行。

标签: python function slice


【解决方案1】:

编辑以更正“停止”。

这两个符号是一致的,也许你把0None 混淆了? 0 是一个位置,None 是没有那个位置。引用源代码 (Objects/sliceobject.c):“start、stop 和 step 是 Python 对象,None 表示不存在索引。

None0 的起始位置相同。

>>> s = 'Q0134CA24B'
>>> s[:1]
'Q'
>>> s[0:1]
'Q'

对于停止,None 表示“直到序列结束”,而0 表示位置。

>>> s = 'Q0134CA24B'
>>> s[1:]
'0134CA24B'
>>> s[1:0]
''

>>> s[::-1]    # Simple 'reverse' trick
'B42AC4310Q'
>>> s[:None:-1]
'B42AC4310Q'
>>> s[:0:-1]
'B42AC4310'    

对于步骤,None 表示一,但0 无效,会引发ValueError,如果您使用[ ] 表示法或slice(),则相同。

以你的例子为例(str 是一个不好的变量名称):

>>> s = 'Q0134CA24B'
>>> cmd = slice(0,1)
>>> s[cmd]
'Q'
>>> s[0:1]
'Q'

>>> cs = slice(-2,0)
>>> s[cs]
''
>>> s[-2:0]
''
>>> cs
slice(-2, 0, None)

>>> s[-2:None:None]
'4B'
>>> s[-2::]
'4B'
>>> cd = slice(-2,None,None)
>>> str[cd]
'4B'

没有不一致的地方。

【讨论】:

  • 非常感谢我在第一行产生误解的根本原因和善意的解释。但我为这个错误感到非常愚蠢。
  • "对于长度..." - 不,没有长度参数。你得到停止和长度混淆。停止值 0 表示您选择的子序列在原始序列的索引 0(不包括)处结束,而不是您选择长度为 0 的子序列。
  • @user2357112:哎呀 - 你是对的 - 已编辑
猜你喜欢
  • 2015-10-08
  • 2019-08-15
  • 2012-02-06
  • 1970-01-01
  • 1970-01-01
  • 2014-10-05
  • 2013-10-24
  • 2015-07-24
相关资源
最近更新 更多