uskhbs   1년 전

아래 코드를 실행하면 

IndexError: list index out of range 오류가 발생합니다

위치는 64번 라인이구요.

무슨 문제인지 도저히 모르겠는데 

if index < l and time == info[index][0] : 로 수정하면 문제가 해결됩니다. 

단순히 앞뒤 위치만 바꾼건데 해결이 되서 원인이 뭔지 알고싶습니다. 고수분들 도와주세요

osthus   1년 전

and 연산은 앞에서부터 조건을 확인하고, 처음 false를 만나면 그 이후의 조건은 확인하지 않고 종료합니다. 

 if index < l and time == info[index][0] :

위의 경우에는 index < l 일 때만 info[index][0]에 접근하고, index >= l일 때는 접근하지 않고 종료합니다.

하지만 if time == info[index][0] and index < l 의 경우에는 index 값에 상관 없이 info[index][0]에 접근하기 때문에 index >= l일 때 out of range가 발생하는 것으로 보입니다.

uskhbs   1년 전

답변주셔서 감사합니다. 조금은 이해가 가는 듯 한데 밑에 말씀이 조금 어렵네요.

"if time == info[index][0] and index < l 의 경우에는 index 값에 상관 없이 info[index][0]에 접근하기 때문에 index >= l일 때 out of range가 발생하는 것으로 보입니다."

예시로 코드를 돌려도 index >= l 의 상황이 오지 않는데도(추측) 오류가 생길 수 있나요?

또 " index 값에 상관 없이 info[index][0]에 접근 " 라고 말씀해주셨는데, 값에 상관을 안쓴다는게 어떤 의미인지 모르겠습니다. 왜 상관 없이 접근하는지..

귀한시간 써주셔서 감사합니다.

osthus   1년 전

방향 전환이 모두 일어나기 전에 벽 또는 자신의 몸과 만나서 종료되는 경우가 아니라면 반드시 index == l이 되는 상황이 발생합니다.

간단하게 l = 1이고, 1초에 방향 전환이 일어나는 경우를 생각해보면, 64번째 줄 if문이 종료되고 난 후에는 index = 1이 됩니다.

index 값에 상관없이 접근한다는 의미는 앞의 코드와 달리 index의 범위를 체크하지 않고 일단 info[index][0]에 접근한다는 의미로 작성하였습니다.

 맞은 코드의 경우 index < l이 true인지 확인하고, true라면 info[index][0] == time이 true인지 확인합니다. 이 경우 index의 범위를 확인하고, index < l이라면 info[index][0]에 접근하고, index >= l이라면 바로 건너뛰기 때문에 info[index][0]에 접근하지 않습니다. index의 값에 따라 info[index][0]에 접근하거나 접근하지 않거나 합니다.

틀린 코드의 경우 info[index][0] == time이 true인지 확인한 후, true라면 index < l이 true인지 확인합니다. 이 경우에는 일단 info[index][0]에 접근하여 값을 가져오려고 합니다. 하지만 index == l인 경우에는 아예 info[index][0]에 접근이 불가능하므로 (index의 범위는 확인하지 않고) 바로 에러가 발생하고 죽어버립니다.


제가 글을 명확하게 못써서 이해하기 어려우신 거 같습니다... 혹시 이해 안되시면 더 적어주세요.

uskhbs   1년 전

"간단하게 l = 1이고, 1초에 방향 전환이 일어나는 경우를 생각해보면, 64번째 줄 if문이 종료되고 난 후에는 index = 1이 됩니다."

이게 왜지? 하고 했는데 종료시점을 안정해줘서 다시 64번줄로 가겠네요.. 이걸 이제봣네요 ㅠㅠ..

감사합니다 덕분에 많은 공부가 되었습니다. 

댓글을 작성하려면 로그인해야 합니다.