Отрицательная подписка Python

В настоящее время я читаю «Концепции языков программирования» Роберта Себесты, 10-е издание (2012 г.). В главе о типах данных написано: «Ruby и Lua поддерживают отрицательные индексы, а Python — нет». Я думал, что отрицательные индексы можно сделать в Python, используя list_name[-i]. Что такое отрицательные индексы тогда?


person Felipe Cortez    schedule 02.03.2014    source источник
comment
Странный. Я вижу, как неправильное использование терминологии может привести к заявлению Lua, но Ruby, похоже, ведет себя точно так же, как Python в этом отношении .   -  person    schedule 02.03.2014
comment
Вы считаете сзади, т. е. list[-1] — это последний элемент списка, list[-2] — предпоследний элемент и так далее.   -  person Carsten    schedule 02.03.2014
comment
Может автор ошибся? en.wikibooks.org/wiki/Python_Programming/Strings   -  person zhangxaochen    schedule 02.03.2014
comment
@zhangxaochen Я так и думал, но все же довольно странно ошибаться в чем-то подобном.   -  person Felipe Cortez    schedule 02.03.2014
comment
@FelipeCortez, возможно, вы могли бы связаться с автором для получения дополнительной информации.   -  person zhangxaochen    schedule 02.03.2014
comment
@zhangxaochen Думаю, да. Спасибо за помощь.   -  person Felipe Cortez    schedule 02.03.2014


Ответы (2)


Python, Lua и Ruby поддерживают отрицательные индексы. В Python эта функция была добавлена ​​в виде сноски в версии 1.4 и подтверждено как расширенное разделение в версии 2.3

На стр. 264 книги Себесты (10-е изд.) он утверждает, что Python не поддерживает отрицательное индексирование массивов. Первоначальный текст был переработан и переиздан как редакция 6 в 2004 г., тогда как Python 2.3 был выпущен 29 июля 2003 г. Я предполагаю, что расширенная нарезка была упущена из виду и была ошибочной с момента выпуска 6-й редакции Sebesta.

Я не могу найти опечатки для 10-го издания. Вы можете написать автору по электронной почте и сообщить ему.

person Myles Baker    schedule 02.03.2014
comment
Возможность использовать отрицательные индексы была в Python, по крайней мере, с версии 1.4. Расширенная нарезка просто расширила нарезку на кортежи, списки и строки — отрицательная индексация уже была доступна. Иногда учебники ошибаются. - person holdenweb; 02.03.2014
comment
Я думал, что это может быть так, но я не смог найти никаких доказательств о функциях до 1.5. Во всяком случае, автор, кажется, не знает об ошибке, поэтому было бы целесообразно связаться с ним. - person Myles Baker; 02.03.2014
comment
docs.python.org/release/1.5/lib/ сноска 1 показывает, что даже в версии 1.5 отрицательные индексы были стандартной функцией языка. - person holdenweb; 02.03.2014

В 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> значение).

person Michael Geary    schedule 02.03.2014
comment
Я уже рассматривал это, но это тоже не кошерно, потому что эквивалент таблицы Lua в Python и Ruby — это не список/массив, а dict/хэш. Те, конечно, также поддерживают любые индексы. - person ; 02.03.2014
comment
Поведение Lua похоже на поведение JavaScript, верно? Это похоже на то, что индексы были ключами словаря. - person Felipe Cortez; 02.03.2014
comment
@delnan - Да, это хороший момент. Таблицу Lua можно использовать как массив, и в Lua есть некоторые оптимизации для поддержки этого случая, но в принципе это больше похоже на словарь или хэш. - person Michael Geary; 02.03.2014
comment
@FelipeCortez - мне это кажется правильным. Я добавил тест JavaScript для сравнения. - person Michael Geary; 02.03.2014