В настоящее время я читаю «Концепции языков программирования» Роберта Себесты, 10-е издание (2012 г.). В главе о типах данных написано: «Ruby и Lua поддерживают отрицательные индексы, а Python — нет». Я думал, что отрицательные индексы можно сделать в Python, используя list_name[-i]
. Что такое отрицательные индексы тогда?
Отрицательная подписка Python
Ответы (2)
Python, Lua и Ruby поддерживают отрицательные индексы. В Python эта функция была добавлена в виде сноски в версии 1.4 и подтверждено как расширенное разделение в версии 2.3
На стр. 264 книги Себесты (10-е изд.) он утверждает, что Python не поддерживает отрицательное индексирование массивов. Первоначальный текст был переработан и переиздан как редакция 6 в 2004 г., тогда как Python 2.3 был выпущен 29 июля 2003 г. Я предполагаю, что расширенная нарезка была упущена из виду и была ошибочной с момента выпуска 6-й редакции Sebesta.
Я не могу найти опечатки для 10-го издания. Вы можете написать автору по электронной почте и сообщить ему.
В Python и Ruby отрицательный индекс индексирует назад от конца массива. То есть, когда индекс отрицательный, к нему добавляется длина массива.
В Луа такого нет. Отрицательный индекс не имеет особого значения; он просто ссылается или создает запись таблицы с этим отрицательным числом в качестве ключа.
Питон 2.7.3:
>>> a = [ 'x', 'y', 'z' ]
>>> a
['x', 'y', 'z']
>>> a[-1]
'z'
>>> a[-1] = 'm'
>>> a
['x', 'y', 'm']
>>>
Руби 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>
Луа 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
не обновляется.
Хром 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()
— это последнее выражение, оцениваемое в цикле, и оно не возвращает значение (оно просто выводит< /em> значение).
list[-1]
— это последний элемент списка,list[-2]
— предпоследний элемент и так далее. - person Carsten   schedule 02.03.2014