Python 3.x Python中的NameError和ValueError

Python 3.x Python中的NameError和ValueError,python-3.x,Python 3.x,为什么PythonShell会抛出一个NameError,而windows控制台会抛出一个ValueError def PrintArgs(*arg): list = ['1','2'] for i in arg: try: print(list[int(i)]) except ValueError: print('Please enter integer value') except

为什么PythonShell会抛出一个NameError,而windows控制台会抛出一个ValueError

def PrintArgs(*arg):
    list = ['1','2']
    for i in arg:
        try:
            print(list[int(i)])
        except ValueError:
            print('Please enter integer value')
        except NameError:
            print('Name Error')

if __name__ == '__main__':
    PrintArgs(*sys.argv[1:])
向Windows控制台提供以下参数将提供此输出:

下面是我在windows控制台中调用代码的方式:

C:\>C:\Python34\python C:\Users\User\Documents\PYTest\Test.py 0 a

1
Please enter integer value
向Python Shell提供以下参数不会显示上述代码中提到的NameError的cusom错误,但会提到以下错误:

PrintArgs(0,a)

Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
PrintArgs(0,a)
NameError: name 'a' is not defined
PrintArgs(0,a)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
PrintArgs(0,a)
NameError:未定义名称“a”

在您提供的代码示例中,您定义了一个列表i,然后迭代一个名为list的集合,并将此列表中的值分配给i,从而删除原始值。我猜您只提供了部分代码,请提供一个最低限度的工作示例


如果我试图重现您的问题,我只会得到一个类型错误,用于对未初始化的列表进行迭代。

您确定这就是您在Windows控制台(我猜这意味着在
.py
脚本中)和python shell中测试的截取吗?这将导致
缩进错误:两者都出现意外缩进。--如果你修正了缩进,你仍然在迭代一些与第一行列表不同的东西,如。放弃你的except块,给我们真正的错误回溯;您正在将有用的信息与那些非处理程序一起丢弃。了解
arg
的值也会有所帮助。不要调用一个变量
list
,这个变量充其量是混乱的,最坏的情况是坏的。@msw为没有提供实际的代码而道歉,因为我不在我的工作站附近,所以我在没有编辑器的情况下手动键入了它。我再次更新了这个问题。好的,现在您可以遍历正确的列表。但是,不要获取列表中的第i项并尝试打印其整数值,而是获取该项,将其强制转换为int并尝试打印列表中的“第i项”项。因此,首先打印第二项(因为第一项的索引为0),当我测试代码时,它正确地打印为“a”。然后继续打印列表的第a项,即第98项,97是小写a的Ascii值。由于该列表仅包含2项,因此产生了一个错误。很抱歉,没有提供实际代码,因为我不在工作站附近,所以我在没有编辑器的情况下手动键入。我再次更新了问题。您没有以任何方式使用移交给脚本的参数。首先,通过只将第二个到第n个项目移交给函数,放弃第一个参数(使用[],而不是[1:])。另外,在函数中,您不使用参数,只对在那里初始化的列表进行操作。另外,您仍然使用列表中的项目作为同一列表的索引,因此由于没有第三个元素,因此会产生错误。sys.argv[]给出SyntaxError:Invalid syntaxat[]我正在使用参数,我正在循环提供的参数:for I in arg:。。。