Python sys.argv 列表和索引

29 投票
5 回答
134708 浏览
提问于 2025-04-15 21:31

在下面的代码中,我知道 sys.argv 是用列表来处理的,但我不太明白这里的索引是怎么用的。

def main():

  if len(sys.argv) >= 2:
    name = sys.argv[1]
  else:
    name = 'World'
  print 'Hello', name

if __name__ == '__main__':
  main()

如果我把

name = sys.argv[1]

改成

name = sys.argv[0] 

然后输入一些参数,它会返回:

Hello C:\Documents and Settings\fred\My Documents\Downloads\google-python-exercises
\google-python-exercises\hello.py

这有点道理。

有人能解释一下这里的 2 是怎么用的吗:

if len(sys.argv) >= 2:

还有这里的 1 是怎么用的:

name = sys.argv[1] 

5 个回答

6

简单来说,sys.argv 是一个包含运行程序时输入的命令中所有单词的列表。列表中的第一个单词(也就是第一个元素)是程序的名字,后面的元素就是你提供的任何参数。在大多数编程语言中(包括Python),列表的索引是从零开始的,这意味着列表中的第一个元素(在这里就是程序名)是 sys.argv[0],第二个元素(如果有的话,就是第一个参数)是 sys.argv[1],依此类推。

测试 len(sys.argv) >= 2 只是用来检查这个列表的长度是否大于或等于2,如果是的话,说明至少给程序提供了一个参数。

12

sys.argv 是传递给 Python 程序的一系列参数。第一个参数 sys.argv[0] 实际上是程序的名字,就是你运行它时用的名字。这不是 Python 特有的,而是大多数操作系统的工作方式。存在 sys.argv[0] 的原因是,你可以根据程序是如何被调用的来改变它的行为。而 sys.argv[1] 则是你实际传递给程序的第一个参数。

在 Python 中,列表(就像大多数序列一样)是从 0 开始编号的,而且如果你试图访问超出列表末尾的索引会出错,所以在访问 sys.argv[1] 之前,你需要检查一下这个列表的长度是否至少为 2。

48

假设你在命令行上输入了:

C:\> C:\Documents and Settings\fred\My Documents\Downloads\google-python-exercises
\google-python-exercises\hello.py John

为了让它更容易理解,我们把它简化为:

C:\> hello.py John

argv代表所有通过命令行输入的内容,但计数是从零(0)开始的,而不是从一(1)开始:在这个例子中,"hello.py"是第0个元素,"John"是第1个元素。

换句话说,sys.argv[0] == 'hello.py'sys.argv[1] == 'John' ... 但是,看看这里有多少个元素?是2,对吧!所以即使数字是0和1,这里实际上有2个元素。

len(sys.argv) >= 2只是检查你是否输入了至少两个元素。在这个例子中,我们正好输入了2个。

现在让我们把你的代码翻译成简单的英语:

define main() function:
    if there are at least 2 elements on the cmd-line:
        set 'name' to the second element located at index 1, e.g., John
    otherwise there is only 1 element... the program name, e.g., hello.py:
        set 'name' to "World" (since we did not get any useful user input)
    display 'Hello' followed by whatever i assigned to 'name'

那么这意味着什么呢?这意味着如果你输入:

  • "hello.py",代码会输出"Hello World",因为你没有提供名字。
  • "hello.py John",代码会输出"Hello John",因为你提供了名字。
  • "hello.py John Paul",代码仍然会输出"Hello John",因为它并没有保存或使用sys.argv[2],也就是"Paul" -- 你能看到在这种情况下len(sys.argv) == 3吗?因为sys.argv列表中有3个元素。

撰写回答