Python列表索引超出范围应该不是问题

时间:2013-02-15 04:08:42

标签: python

每次在Windows中按下某个键时,我都会使用此代码记录按键。在我看来,代码是完美的;没有不必要的循环或未定义的变量,它应该工作得很好。

但是,我一直在终端中得到这个:

Everything Imported Successfully
Starting Loop
Beginning Checks
Traceback (most recent call last):
  File "C:\Users\***\relogged.pyw", line 15, in <module>
    loop(OldKeyChar=[])
  File "C:\Users\***\relogged.pyw", line 9, in loop
    if OldKeyChar[num] == '1': #check to see if key was pressed
IndexError: list index out of range

我错过了什么?它应该工作,但我的代码会导致错误。

import win32api 
print("Everything Imported Successfully")

def loop(OldKeyChar):
    print("Beginning Checks")
    while(True): #always checking
        for num in range(0,127): #iterate through list of ascii codes
            if not win32api.GetAsyncKeyState(num): #if key is not being pressed
                if OldKeyChar[num] == '1': #check to see if key was pressed 
                    OldKeyChar[num] = '0' #make sure not recorded again
            else:
            OldKeyChar[num] = '1' #add pressed key to pressed list

OldKeyChar = ['0' for i in range(0,127)]
print("Starting Loop")
loop(OldKeyChar=[])

3 个答案:

答案 0 :(得分:1)

OldKeyChar是一个空列表,因此当您运行此列表时,它将进入while循环,然后输入for循环,将0分配给{{1} }}。如果正在按下某个键,它将尝试检查不存在的num

在您的情况下解决此问题的方法是使用OldKeyChar[0]预填充列表。您试图这样做,但由于某种原因,正在传递一个空列表。由于数字是不可变的,您可以通过简单地将列表相乘来实际构建此预填充列表:

0

请注意,PEP-8建议为类保留loop(OldKeyChar=[0]*128) ,并将CapWords用于其他内容。

请注意,我认为这不是一个很好的实现。相反,请考虑使用在特定循环中按下的lowercase_with_underscores值:

set

这里用set comprehension构造。这允许你检查一个键是否被按下(如果它在def loop(): print("Beginning Checks") while(True): pressed = {i for i in range(0, 127) if win32api.GetAsyncKeyState(i)} ,它是,如果不是,它不是),并且没有必要重置它,因为它将在下一次迭代(如果你必须保持与在别处使用它的引用相同的集合,你可以在每次迭代时pressed,然后进行更新。

答案 1 :(得分:1)

因为您将空列表传递给loop函数?

loop(OldKeyChar=[])

应该就是这样:

loop(OldKeyChar)

答案 2 :(得分:1)

loop(OldKeyChar=[])

应该是

loop(OldKeyChar)