【问题标题】:Python extented slicing with lists: is the documentation correct?使用列表进行 Python 扩展切片:文档是否正确?
【发布时间】:2011-05-31 18:19:04
【问题描述】:

http://docs.python.org/reference/expressions.html#slicings 的文档说(摘录):

5.3.3。切片

切片选择序列对象中的一系列项目(例如,字符串、元组或列表)。

slicing          ::=  simple_slicing | extended_slicing
simple_slicing   ::=  primary "[" short_slice "]"
extended_slicing ::=  primary "[" slice_list "]"
slice_list       ::=  slice_item ("," slice_item)* [","]
slice_item       ::=  expression | proper_slice | ellipsis
proper_slice     ::=  short_slice | long_slice
short_slice      ::=  [lower_bound] ":" [upper_bound]
long_slice       ::=  short_slice ":" [stride]
lower_bound      ::=  expression
upper_bound      ::=  expression
stride           ::=  expression
ellipsis         ::=  "..."

简单切片的语义如下。主对象必须评估为序列对象...

扩展切片的语义如下。主节点必须评估为映射对象,...

问题:

为了支持 [1,2,3][a:b:c] 表示法,语言参考要求 lists映射对象stride 仅用于“扩展切片”,用于映射对象)。那么,语言参考是否损坏(可能他们只是在引入What's New in Python2.3: Extended Slices 时忘记更新它?)?

此外,切片显然不仅适用于序列对象(参见上面的第一句话)。

还是只有我一个人? ;)

附言

有趣的是,http://docs.python.org/release/3.1.3/reference/expressions.html#slicings 上的 Python 3 文档说:

切片选择序列对象中的一系列项目(例如,字符串、元组或 列表)...

[“统一”切片定义,此处不区分“扩展”和“简单”]

切片的语义如下。主节点必须评估为映射对象,...

【问题讨论】:

  • 是我一个人,还是我根本听不懂你?你能澄清一下吗?
  • @ultimatebuster 或者我们俩......跨度>
  • 我实际上从未听说过“跨步”这个词。根据我在 3 分钟内得出的结论,是步骤?喜欢list[start:stop:stride]
  • 换句话说,你想做什么? xD
  • @mlvljr,同意你的观点,语言参考并不严格正确

标签: python list slice


【解决方案1】:

关于映射的语言被破坏了;它应该在所有情况下都说“序列或映射”以匹配解释器的行为。两种协议都可以接受切片对象,并且解释器将在所有情况下进行转换。但是,对于内置类型,只有序列实际上支持它:

 >>> a = {'a': 1, 'c': 2}
 >>> a['a':'b']
 Traceback (most recent call last):
   File "<pyshell#32>", line 1, in <module>
     a['a':'b']
 TypeError: unhashable type: 'slice'

请注意,这是抱怨切片不是有效键的字典,而不是抱怨您无法在映射上执行切片的解释器。这是有道理的——字典没有隐含的键顺序,因此不清楚切片的含义。

【讨论】:

    【解决方案2】:

    不幸的是,What's New 和 langref 使用了两种不同的“扩展切片”定义。两份文件对各自的定义都是正确的。

    【讨论】:

    • 好的,但是 langref 在跨步上的正确性如何——作为扩展切片的一部分——仍然是映射对象的一部分?
    • 不是。 langref 正在谈论使用元组作为切片,例如foo['bar', 42].
    • 那么,[][0:1:2],不符合 langref 的定义,对吧?
    • 我看错了。 langref 中的“扩展切片”涵盖元组和步幅。
    • 似乎我没有足够的代表来链接相关问题,您是否可以将这些链接到这里:stackoverflow.com/questions/2761003/…stackoverflow.com/questions/752602/…
    猜你喜欢
    • 2019-10-01
    • 1970-01-01
    • 2018-07-27
    • 2016-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-29
    • 2020-08-27
    相关资源
    最近更新 更多