카테고리 없음

파이썬 IndexError: 리스트 인덱스가 범위를 벗어났습니다. 인덱스로 접근할 수 없습니다.

스택큐힙리스트 2023. 12. 28. 03:24
반응형

Traceback (most recent call last):
File <ipython-input-6-5233b0a578b1>, line 1, in <module>
runfile('C:/Users/Blair/Documents/Python/Neato XV-11 Lidar/Serial9.py', wdir='C:/Users/Blair/Documents/Python/Neato XV-11 Lidar')
File C:\Program Files (x86)\WinPython-32bit-3.4.3.3\python-3.4.3\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py, line 682, in runfile
execfile(filename, namespace)
File C:\Program Files (x86)\WinPython-32bit-3.4.3.3\python-3.4.3\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py, line 85, in execfile
exec(compile(open(filename, 'rb').read(), filename, 'exec'), namespace)
File C:/Users/Blair/Documents/Python/Neato XV-11 Lidar/Serial9.py, line 88, in <module>
print( CheckSumByte[0]) #Out of Range??
IndexError: list index out of range

Kenny: 감사합니다. 두 바이트로 더 간단합니다:

CheckSumByte.append(ser.read(1))
CheckSumByte.append(ser.read(1))

정상적으로 작동하지만 조금 어색합니다. 항목은 바이트 형식입니다. 리스트 컴프리헨션을 사용하여 항목을 추가하는 방법은 어떻게 해야 합니까? 속도가 느린 append 함수를 피하고 싶습니다.


CheckSumByte의 항목이 정수인 경우 작동하지 않는 것을 알 수 있습니다. Python 3의 리스트 컴프리헨션은 바이트를 바이트로 추가하기 위해 특별한 형식이 필요합니까?

답변 1

최신 댓글에 따르면 다음과 같이 ser을 구성한 것 같습니다:


ser = serial.Serial(
port=PortName, baudrate=115200, parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS,
timeout=0)

문서에 따르면 이는 ser비차단 모드임을 의미합니다(하지만 당신의 주장과는 다르게 차단 모드인 것으로).


비차단 모드로 작동하므로 ser.read(n)이 정확히 n바이트를 반환할 이유는 전혀 없습니다. 대신, 만약 n바이트를 읽고 싶다면 다음 중 하나를 수행해야 합니다:



  • 생성자에서 차단 모드로 ser을 구성하세요 (timeout=None을 사용).

  • 네트워크 소켓을 읽는 경우와 마찬가지로 실제로 읽어들인 바이트 수를 모니터링하는 동안 루프를 실행하세요.

나중의 경우에는 예를 들어 n바이트를 읽으려면 다음과 같이 해야합니다:


def read_exactly(ser, n):
bytes = b
while len(bytes) < n:
bytes += ser.read(n - len(bytes))
return bytes

특정 경우에는 입력 버퍼를 모니터링하여 다음 읽기에 충분한 데이터가 있는지 확인하는 것처럼 보입니다. 그러나이 모니터링은 일부 시간에만 발생하며 모든 시간에는 발생하지 않습니다. 따라서 FirstByte != 0xFA이면 위에서 제시 된 방법 중 하나를 채택하지 않으면 읽기 버퍼를 고갈시킬 수 있습니다.

답변 2

파이썬 IndexError: 리스트 인덱스 범위를 벗어남. 인덱스로 접근할 수 없습니다.
파이썬은 강력하고 널리 사용되는 프로그래밍 언어로, 많은 사람들이 이를 활용하여 다양한 프로젝트를 수행합니다. 그러나 때로는 코드 작성 시 잘못된 접근으로 인해 발생하는 오류가 있을 수 있습니다. 이 중 하나가 'IndexError: 리스트 인덱스 범위를 벗어남'으로 알려진 오류입니다. 이 오류는리스트나 배열에 대한 인덱스로 접근하려고 할 때 발생하며, 해당 인덱스가 유효한 범위(0부터 시작하여 리스트의 길이보다 작은 범위)를 벗어났을 때 나타납니다.
이러한 리스트 인덱스 범위 오류는 주로 다음과 같은 경우에 발생할 수 있습니다. 첫째로, 잘못된 인덱스를 사용하여 리스트의 요소에 접근하는 경우입니다. 예를 들어, 리스트에 5개의 요소가 있지만 6번째 요소에 접근하려고 할 때 해당 오류가 발생합니다. 둘째로, 리스트의 길이를 벗어난 인덱스를 반복문에서 사용하는 경우에도 이 오류가 발생할 수 있습니다.
이러한 오류가 발생하는 경우 프로그램이 예기치 않게 중단될 수 있으므로 개발자는 코드 내에서 이를 방지하기 위해 몇 가지 조치를 취해야 합니다. 첫째로, 인덱스에 접근하기 전에 리스트의 길이를 확인하는 것이 중요합니다. 이렇게 하면 유효한 인덱스 범위 내에서만 접근하도록 보장할 수 있습니다. 또한, 반복문을 사용할 때는 유효한 인덱스 범위 내에서만 반복하도록 주의해야 합니다.
마지막으로, 이러한 오류를 처리하기 위해 파이썬에서는 try-except 문을 제공합니다. 이를 사용하면 발생할 수 있는 오류에 대한 예외 처리를 수행할 수 있습니다. 예를 들어, try 블록 내에서 리스트 인덱스에 접근하고, IndexError가 발생한 경우 except 블록에서 추가 조치를 취할 수 있습니다. 이를 통해 오류 발생 시 프로그램이 비정상적으로 종료되지 않고 계속 실행될 수 있습니다.
파이썬의 IndexError: 리스트 인덱스 범위를 벗어남 오류는 잘못된 인덱스로 접근할 때 발생하는 중요한 오류입니다. 이를 방지하기 위해서는 인덱스에 대한 유효성 검사와 예외 처리를 적절히 사용하는 것이 필요합니다. 이를 통해 코드의 안정성을 향상시키고, 프로그램이 예상대로 동작할 수 있도록 보장할 수 있습니다.

반응형