본문 바로가기

Python

(Python 오류) - TypeError : list indices must be integers or slices, not float

반응형

 python은 변수 선언 시 type명을 명시하지 않습니다. 따라서 인터프린팅시 변수의 자료형을 알기 위해서 묵시적 형변환이 이루어지는데 제대로된 형변환이 이루어지지 않을 때 TypeError가 나타납니다. 그 중 이 오류는 list의 인덱스에 접근할 때 int형으로 하지 않게되어 생깁니다.

 배열의 인덱스를 /(나누기) 연산한 결과값은 묵시적 형변환에 의해 자료형이 float형으로 변환됩니다. 배열을 접근할 때는 양의 정수값으로 해야하지만 float형 예를 들면 0.5같은 값으로 인덱스를 접근하려다보니 소수점 인덱스가 존재하지 않는 배열에 대해 접근했다고 오류를 띄우는 것입니다. 

 

 즉, int형 인덱스를 float형으로 접근해 생기는 자료형 오류입니다. C++, C, java를 하다가 이거하면 갑자기 헷갈립니다. 해당 언어들은 int형으로 선언된 변수에 나눈 결과값을 배정해주면 알아서 int형으로 변환되며 소수점이 버려지기 때문입니다.

 

해결방법

//연산은 python 3.x version에서 버림 나눗셈을 해줍니다.

/로 써져있는 부분을 //로 고치면 알아서 컴파일 과정 중 소수점 부분을 버려줍니다. 따라서 나눈 연산 결과가 float형이더라도 알아서 int형으로 바꿔줍니다. 

 

Code

아래 소스는 예시코드로 binary_search하는 부분입니다. 배열의 인덱스를 mid가 float형으로 접근할 수도 있기에 //로 써줬습니다.

 

a = [1,11,15,19,37,48,59,61];
def b_search(x):
    l = 0;
    r = 7;
    ans = 0;
    while l <= r :
        mid = (l + r) // 2;
        if a[mid] < x:
            l = mid + 1;
        elif a[mid] > x:
            r = mid - 1;
        elif a[mid] == x:
            ans = mid;
            break;
    if ans:
        return ans+1;
    else:
        return 0;
search = int(input());
ans = b_search(search);
if ans:
    print("찾으시는 숫자는",ans,"번째에 있습니다");
else:
    print("None");

 

 문제가 발생될 수 있는 부분은 mid = (l + r ) // 2 부분입니다. 만약 // -> /였다면 l=1 r=4라고 가정했을 때 2로 나눈값 2.5가 mid에 배정됩니다. 바로 아랫줄에서 if문으로 a[mid]를 사용하는데 a[2.5]라는 값은 없기 때문에 TypeError를 뱉게 됩니다.