我写了这段代码:
#!/usr/bin/env python
import sys
if sys.argv[1] :
print sys.argv[1]
键入时在控制台中尝试: $ python py.py xxx 打印xxx 当我离开时没有参数时会出现错误:
回溯(最近一次呼叫最后一次):文件" py.py",第4行,in if sys.argv [1]:IndexError:列表索引超出范围
现在进行一些更改:
#!/usr/bin/env python
import sys
if sys.argv[1:] :
print sys.argv[1:]
你看我也改变了[1]到[1:],如果我输入" $ python py.py"在控制台中忘记返回无错误的参数。 什么事发生在幕后?
答案 0 :(得分:6)
sys.argv
是一个参数列表。
因此,当您执行没有任何参数的脚本时,您访问索引1的列表为空,访问空列表的索引将引发IndexError
。
使用第二个代码块,您正在执行list slice,并且您正在检查索引1和转发的列表切片是否为空,然后打印列表中的那个切片。 为什么这样做是因为如果你有一个空列表并像这样对它做一个切片,那么切片会返回一个空列表。
last_list = [1,2,3]
if last_list[1:]:
print last_list[1:]
>> [2,3]
empty_list = []
print empty_list[:1]
>> []
答案 1 :(得分:0)
sys.argv是一个参数列表(你在终端中传递了你的命令)但是当你没有传递任何参数并访问空列表的索引1时,它会给出一个明显的错误(IndexError)。 但是,在第二种情况下,你正在从索引1切片并使用索引> 1的列表成员,即使列表为空也应该没有问题,因为切片列表也将是空的,我们得到没错。