Python负面下标

时间:2014-03-02 17:07:49

标签: python indices subscript

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

2 个答案:

答案 0 :(得分:6)

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 :(得分: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的行为非常相似。您可以在数组上使用负下标,实际上您可以使用任意字符串作为下标。 JavaScript数组实际上是一个对象,带有一些额外的方法,属性(.length)和行为(根据需要更新.length)。当您使用array[-1]时,您正在使用密钥"-1"添加或引用属性,并且.length未更新。

Chrome 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()是循环中评估的最后一个表达式并且它不返回值(它只是打印一个值)。