Python负下标

Posted

技术标签:

【中文标题】Python负下标【英文标题】:Python negative subscripting 【发布时间】: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]是倒数第二个元素等等。 作者可能错了? en.wikibooks.org/wiki/Python_Programming/Strings @zhangxaochen 我也是这么想的,但是弄错这样的东西还是很奇怪的。 @FelipeCortez 也许您可以联系作者以获取更多信息 【参考方案1】:

Python、Lua 和 Ruby 支持负下标。在 Python 中,此功能被添加为 a footnote in version 1.4 和 reaffirmed 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 测试来进行比较。

以上是关于Python负下标的主要内容,如果未能解决你的问题,请参考以下文章

Qt_C2188-负下标C2027QScopedPointer

Leetcode刷题Python55. 跳跃游戏

55. 跳跃游戏

55. 跳跃游戏

55. 跳跃游戏

55. 跳跃游戏-贪心