sys.argv
是一个列表,其中包含在命令行上调用您的 python 脚本的所有参数,脚本本身被认为是“参数 0”。
它是一个普通变量,与恰好包含列表的任何其他变量相同。sys.argv
所以和之间没有“选择” *arg
。*arg
是用于解包列表(或其他序列)以作为多个参数传递给调用的语法。传递时可以使用此语法sys.argv
,就像使用包含列表的任何其他变量一样。或者您可以省略*
并将整个列表作为一个参数传递。同样,列表是否碰巧与发生的sys.argv
事情无关。
我认为您感到困惑的根源在于,您从中调用 python 脚本的 shell 不会像 Python 那样考虑将多个参数分开。在 Python 中,您使用逗号分隔多个参数,因此'hello','salut','hola'
3 个参数也是如此(尽管在逗号后放置空格会更常见)。
在大多数 shell OTOH 中,参数由空格分隔。'hello','salut','hola'
不包含任何空格,所以它只是一个参数。sys.argv
因此它作为一项显示在 Python 列表中。没有什么神奇的事情可以为您将多个参数连接成一个。只是曾经只有一个论点。让 Python 级别sys.argv
拥有 3 个项目的方法是调用您的脚本,如下所示:
python trial.py 'hello' 'salut' 'hola'
看起来您在 shell 命令行中使用引号的方式就像在 Python 中一样。在大多数 shell 中,您并不总是需要引用字符串,因为一切都是字符串。相反,引号用于告诉 shell 包含空格的字符串实际上是一个包含空格的参数,而不是多个参数,或者禁用 shell 默认情况下在任何地方执行的某些特殊处理。
在 Python'hello'
中,必须使字符串“hello”,以便 Python 不会尝试将其读取为 variable hello
。但在 shell 中,'hello'
两者hello
都是相同的,只是表示字符串“hello”。但是也可以he'll'o
只用引用的字符串的一部分来编写。这只是改变了 shell 如何处理引号内的空格和其他特殊字符,但仍然产生相同的字符串“hello”。这就是为什么 shell 将您的表单解释'hello','salut','hola'
为字符串“hello,salut,hola”。引号之外没有空格,因此这 3 个单词不会被视为单独的参数,并且在完成告诉 shell 如何处理特殊字符的工作后,引号就会消失。