Индекс отрицательного аргумента Python sys.argv

Почему sys.argv с отрицательным индексом должен позволять печатать то же значение, что и sys.argv[0]? Это также позволяет это до количества переданных аргументов.

Итак, вызов hello.py на developer.google.com, например, приведенный ниже (с 3 аргументами, включая имя скрипта): python hello.py Sumit Test

позволит получить доступ к sys.argv[-1], [-2] и [-3], при этом все они будут печатать то же значение, что и argv[0], то есть hello.py, но argv[-4] выдаст ожидаемую ошибку:

Traceback (most recent call last):
  File "hello.py", line 35, in <module>
    main()
  File "hello.py", line 31, in main
    print (sys.argv[-4])
IndexError: list index out of range

Код:

import sys

# Define a main() function that prints a little greeting.
def main():

  # Get the name from the command line, using 'World' as a fallback.
  if len(sys.argv) >= 2:
    name = sys.argv[1]
  else:
    name = 'World'
  print ('Hello', name)
  print (sys.argv[-3])

# This is the standard boilerplate that calls the main() function.
if __name__ == '__main__':
  main()

person Sumit Nigam    schedule 11.06.2013    source источник
comment
Я не могу понять эту часть sys.argv[-1], [-2] и [-3], поскольку все они печатают то же значение, что и argv[0]. как это не может быть для python hello.py Sumit Test, они должны быть «Test», «Sumit», «hello.py» соответственно.   -  person oleg    schedule 11.06.2013
comment
@olrg - я отредактировал вопрос, чтобы вставить в него код. Я имею в виду строчную печать (sys.argv[-3]).   -  person Sumit Nigam    schedule 11.06.2013


Ответы (2)


Поскольку вы передаете только три аргумента, мой пример ниже должен помочь вам понять:

>>> [1,2,3][-1]   # working 
3
>>> [1,2,3][-2]   # working 
2
>>> [1,2,3][-3]   # working 
1
>>> [1,2,3][-4]   # exception as in your code 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

Отрицательный индекс печатает значение с правой стороны.

Доступ к спискам
Например, наш массив/список имеет размер n, то для положительных индексов 0 будет первым индексом, 1 вторым, а последний индекс будет n-1. Для отрицательных индексов -n является первым индексом, -(n-1) вторым, последним отрицательным индексом будет –1.

На основании вашего комментария добавляю пример для пояснения:

import sys
# main()    
if __name__ == "__main__":
    print len(sys.argv)
    print sys.argv[-1], sys.argv[-2], sys.argv[-3]
    print sys.argv[0],  sys.argv[1], sys.argv[2]

Пожалуйста, обратите внимание на вывод:

$ python main.py one two 
3
two one main.py
main.py one two

Количество передаваемых аргументов равно трем. argv[-1] — последний аргумент, который равен two.

person Grijesh Chauhan    schedule 11.06.2013
comment
@RichieHindle и Grijesh - Спасибо за ответы. Но в этом случае -1 должен возвращать последний переданный аргумент, а не argv[0]. То же самое относится и к -2 и -3? Итак, когда я запускаю программу как: python hello.py Sumit test, тогда argv[0] — это hello.py, и согласно ответам argv[-1] должен быть Test, но он печатает hello.py. То же самое верно для argv[-2] и [-3] - person Sumit Nigam; 11.06.2013
comment
@sumit yes argv[-1] = последний аргумент, проверьте обновленный ответ на примере - person Grijesh Chauhan; 11.06.2013

Отрицательные индексы считаются с конца списка:

>>> ['a', 'b', 'c'][-1]
'c'
>>> ['a', 'b', 'c'][-2]
'b'
>>> ['a', 'b', 'c'][-3]
'a'

Запрашивание [-4] ушло бы в конец списка, создав исключение.

person RichieHindle    schedule 11.06.2013