Python/Debugging

TypeError: 'list' object is not callable 원인과 해결법

jimmy_AI 2022. 3. 30. 19:31
반응형

파이썬 object is not callable 에러 디버깅

리스트 인덱싱 등 과정에서 자주 등장할 수 있는 오류 종류인

'~~ object is not callable' 종류의 오류의 의미와 원인에 대해서 살펴보고

해결 방법을 파헤쳐보도록 하겠습니다.

 

 

오류 의미, 원인

이해를 돕기 위하여, 아래와 같은 아주 간단한 리스트함수를 생각해보도록 하겠습니다.

x = [1, 2, 3] # 리스트

def double(num): # 함수
    return num * 2

x[0] # 리스트 인덱싱
double(1) # 함수 호출

리스트에서 자료를 추출하는 인덱싱 과정에서는 [] 모양의 괄호가 사용되고,

함수에 input을 넣어 호출하는 과정에서는 () 모양의 괄호가 사용되는 것을 알 수 있습니다.

 

그렇다면 만약 인덱싱 과정에서 () 모양의 괄호를 실수로 잘못 사용하였다면 어떻게 될까요?

x(0) # [] 대신 ()로 인덱싱 시도

# 실행 결과
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-5-5471647fe012> in <module>()
----> 1 x(0)

TypeError: 'list' object is not callable
반응형

() 괄호는 파이썬에서 호출의 의미를 가지고 있기 때문에 위의 예시처럼

리스트 자료형은 호출을 지원하지 않는다는 오류를 출력하게 되는 것으로 이해해주시면 됩니다.

 

만일, () 괄호의 호출이 필요한 상황에 [] 괄호를 통한 인덱싱을 시도한

반대의 상황에서는 object is not subscriptable 종류의 오류가 발생합니다.

이에 대한 자세한 내용은 아래 링크의 다음 글에서 설명해두었으니 참고해보세요.

 

TypeError: 'function' object is not subscriptable 해결

파이썬 object is not subscriptable 오류에 대해서 지난 글에서 [] 괄호와 () 괄호의 역할을 구분하며 [] 괄호를 이용한 인덱싱 대신 () 괄호를 사용한 호출을 진행하면 발생하는 object is not callable 종류의.

jimmy-ai.tistory.com

 

 

오류 해결 방법

인덱싱(슬라이싱) 과정과 호출에 각각 사용되는 [] 괄호와 () 괄호의 용도를 바르게 구분하여

올바르게 인덱싱 혹은 슬라이싱을 시도해주시면 위 오류가 해결됩니다.

 

문자열과 넘파이 배열의 예시도 추가로 보여드리면서 이 글을 마무리하도록 하겠습니다.

import numpy as np

# 문자열의 잘못된 인덱싱 예시
y = 'abc'
y(0) # TypeError: 'str' object is not callable

# 넘파이 배열의 잘못된 인덱싱 예시
arr = np.array([1, 2, 3])
arr(0) # TypeError: 'numpy.ndarray' object is not callable

# 올바른 인덱싱 형태
y[0]
arr[0]