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负下标的主要内容,如果未能解决你的问题,请参考以下文章