【问题标题】:Sys.argv python error list index out of rangeSys.argv python错误列表索引超出范围
【发布时间】:2017-12-06 09:10:45
【问题描述】:

我是stackoverflow的新用户,而且我不是英国人,所以对不起我的英语。

我一直在用 python 编程,直到我出错了,但我无法弄清楚出了什么问题......

#!/usr/bin/env python2.7

from random import choice
import sys

def help():
    print ("Please, you need to introduce a Int in this way: PWrand 10")

def PWrand(insert_by_user):
    chars = 'ABCDEFGHIJKLMNOPQRSTUWXYZabcdefghijklmnopqrstuwxyz0123456789!-_:.,;&)('

    for password in range(insert_by_user):
        sys.stdout.write(choice(chars))

 #Command Line

if __name__ == '__main__':

    if len(sys.argv) < 2 or len(sys.argv) > 2:
        help()

    elif (type(sys.argv[2]) != int):
        print("It need to be an Int!")

    else:
        insert_by_user = (sys.argv[2])
        print(PWrand(insert_by_user))

所以,这就是我要的。

Traceback (most recent call last):
  File "./passwordrandom.py", line 24, in <module>
    elif (type(sys.argv[2]) != int):
IndexError: list index out of range

谢谢大家!

【问题讨论】:

  • 列表元素的编号从0开始,那么对于有两个元素的列表,元素的编号是多少?
  • 哦...我以为它是从 '2' 开始的,因为它是你知道的第二个参数吗?比如,第一个是 python 名称,第二个是参数。现在我明白了,虽然我发现了另一个问题,但我无法像 int 那样阅读它
  • 如果一个list有两个item,第一个是item 0,第二个是item 1。没有item 2,试图访问一个是错误的。
  • 它不是一个 int,而是一个字符串。使用 insert_by_user = int(sys.argv[1]) 当然,如果它不是 int 的字符串表示形式,例如 "b",请准备好捕获该 ValueError 异常。
  • 令新程序员感到困惑的是在序列上使用长度,例如len(sys.arg) 在您的测试中将返回 2,以及像 sys.argv[2] 这样的序列上的索引,它将为您提供#3 项。从零开始的索引有一些很好的理由,但大多数情况下它会引起混乱。此外,在您的问题中,您应该展示如何使用您的 args 调用 python 脚本,以明确您使用 2 个 args 进行测试。

标签: python list range argv sys


【解决方案1】:

这里有两个问题。首先是您对列表索引有点困惑。 python中的列表是“零索引”的,这意味着要获取名为L的列表的第一个元素,您需要执行L[0]。同样,要获得第二个,就像您需要的那样,您可以使用L[1]

另一个问题是sys.argv 中的所有元素都将是字符串,因此无法检查类型。您应该尝试将用户输入片段转换为 try 块内的 int 并捕获 ValueError。它看起来像这样:

if __name__ == '__main__':

    if len(sys.argv) < 2 or len(sys.argv) > 2:
        help()

    else:
        try:
            insert_by_user = int(sys.argv[1])
            print(PWrand(insert_by_user))
        except ValueError:
            print("It need to be an Int!")

except ValueError: 块内的代码只有在用户的输入不能正确转换为整数时才会执行。

【讨论】:

  • 哦,我明白了,现在说得通了!非常感谢!
【解决方案2】:

这是因为第一个 if 捕获每个元素少于 2 个的列表或所有元素超过 2 个的所有列表,所以 elif 捕获的所有元素正好有 2 个,它们将存储在位置 0 和 1。

if len(sys.argv) is not 2:
    help()

else:
   user_input = sys.argv[1].decode()
   if not user_input.isnumeric():
      print("It need to be an Int!")
   else:
       user_input = int(user_input)

应该修复它。

【讨论】:

  • “不是”这句话很有帮助,也很有道理xD!谢谢!
  • 太棒了,很高兴能帮上忙。还注意到 type() 以 的形式返回元素,但它是说类型返回。例如:如果您在 python 解释器中键入“int”,它会返回 这是检查对象、变量等类型的 Python 方式。
  • 您应该注意elif 分支永远不会返回true。 argv 列表元素将始终是字符串,您应该通过尝试转换为 int 并将抛出异常作为失败的标志来测试其 intness。
  • @PaulRooney 现在检查一下 ;)
  • 没关系,你不需要更正它。毕竟这不是答案的一部分。尽管我认为您不需要 decode 部分。它是一个字符串,您通常在 bytes 对象上调用 decode。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-13
  • 2016-08-12
  • 2017-07-02
  • 2021-05-12
  • 1970-01-01
相关资源
最近更新 更多