【问题标题】:Python negative subscriptingPython负下标
【发布时间】:2014-04-03 13:10:06
【问题描述】:

我目前正在阅读 Robert Sebesta 的《编程语言概念》,第 10 版(2012 年)。在关于数据类型的章节中,它读作“Ruby 和 Lua 支持负下标,但 Python 不支持”。我认为可以在 Python 中使用list_name[-i] 来完成否定下标。那么什么是负下标呢?

【问题讨论】:

  • 奇怪。我可以看到术语滥用如何导致 Lua 声明,但 Ruby appears to behave 在这方面与 Python 完全一样。
  • 你从后面数,即list[-1]是列表的最后一个元素,list[-2]是倒数第二个元素等等。
  • @zhangxaochen 我也是这么想的,但是弄错这样的东西还是很奇怪的。
  • @FelipeCortez 也许您可以联系作者以获取更多信息

标签: python indices subscript


【解决方案1】:

Python、Lua 和 Ruby 支持负下标。在 Python 中,此功能被添加为 a footnote in version 1.4reaffirmed as extended slicing in version 2.3

在 Sebesta 的书(第 10 版)的第 264 页上,他声称 Python 不支持对数组进行负索引。原始文本在 2004 年进行了大修并重新发布为第 6 版,而 Python 2.3 于 2003 年 7 月 29 日发布。我猜扩展切片自 Sebesta 的第 6 版发布以来被忽略并出现了错误。

我找不到第 10 版的勘误表。您可能想给作者发电子邮件并通知他。

【讨论】:

  • 至少从版本 1.4 开始,使用负索引的能力就已经在 Python 中了。扩展切片只是将切片扩展到元组、列表和字符串——负索引已经可用。有时教科书是错误的。
  • 我认为可能是这种情况,但我找不到任何关于 1.5 之前的功能的证据。无论如何,作者似乎没有意识到这个错误,因此值得与他联系。
  • docs.python.org/release/1.5/lib/… 脚注 1 表明,即使在 1.5 中,负索引也是该语言的标准特征。
【解决方案2】:

在 Python 和 Ruby 中,负下标从数组末尾向后索引。即下标为负数时,加上数组长度。

Lua 中并非如此。负下标没有特殊含义;它只是引用或创建一个以该负数作为键的表条目。

Python 2.7.3:

>>> a = [ 'x', 'y', 'z' ]
>>> a
['x', 'y', 'z']
>>> a[-1]
'z'
>>> a[-1] = 'm'
>>> a
['x', 'y', 'm']
>>>

Ruby 1.9.3:

irb(main):001:0> a = [ 'x', 'y', 'z' ]
=> ["x", "y", "z"]
irb(main):002:0> a
=> ["x", "y", "z"]
irb(main):003:0> a[-1]
=> "z"
irb(main):004:0> a[-1] = 'm'
=> "m"
irb(main):005:0> a
=> ["x", "y", "m"]
irb(main):006:0>

Lua 5.2.3:

> a = { 'x', 'y', 'z' }
> for key, value in pairs(a) do print( key, value ) end
1       x
2       y
3       z
> print( a[3] )
z
> print( a[-1] )
nil
> a[-1] = 'm'
> print( a[-1] )
m
> for key, value in pairs(a) do print( key, value ) end
1       x
2       y
3       z
-1      m
>

JavaScript 的行为与 Lua 的非常相似。您可以在数组上使用负下标,实际上您可以使用任意 string 作为下标。 JavaScript 数组实际上是一个具有一些附加方法、属性 (.length) 和行为(根据需要更新 .length)的对象。当您使用 array[-1] 时,您正在添加或引用带有键 "-1" 的属性,而 .length 不会更新。

铬 33:

> var a = [ 'x', 'y', 'z' ];
undefined
> a
["x", "y", "z"]
> a[2]
"z"
> a[-1]
undefined
> a[-1] = 'm'
"m"
> a[-1]
"m"
> a[2]
"z"
> a
["x", "y", "z"]
> for( var key in a ) console.log( key, a[key] );
0 x
1 y
2 z
-1 m
undefined

不要被最后打印的 undefined 误导 - 这不是 for( var key in a ) 枚举的一部分,它只是打印在那里,因为 console.log() 是循环中评估的最后一个表达式,它不返回值(它只是打印一个值)。

【讨论】:

  • 我已经考虑过这一点,但这也不是 kosher,因为 Lua 表的 Python 和 Ruby 等价物不是列表/数组,而是 dict/hash。当然,这些也支持任何索引。
  • Lua 的行为类似于 JavaScript,对吧?就像索引是字典键一样。
  • @delnan - 是的,这是一个很好的观点。 Lua 表可以使用作为数组,Lua 有一些优化来支持这种情况,但原则上它更像是一个字典或哈希。
  • @FelipeCortez - 这听起来对我来说是正确的。我添加了一个 JavaScript 测试来进行比较。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-16
  • 2011-09-24
相关资源
最近更新 更多