본문 바로가기

프로그래밍/Python

[파이썬초보] TypeError: 'NoneType' object is not subscriptable

반응형

not subscriptable 은 var[ ] 와 같이 생긴 부분에서 에러가 났다는 말임.

 

>>> a = 1
>>> b = 22.1
>>> c = 'abc'
>>> c[1]
'b'
>>> a[1]
Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    a[1]
TypeError: 'int' object is not subscriptable
>>> b[1]
Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    b[1]
TypeError: 'float' object is not subscriptable

위 예제에서 a[1] 에서 'int' object is not subscriptable 이란 에러가 발생했다. a = 1 로 정의되어 있고, a 는 리스트나 어레이가 아니기 때문에, a[1] 과 같이 정수인덱스로 접근하는 것이 불가능하기 때문에 에러가 발생한 것이다.

특히 'NoneType' object is not subscribtable 은 아주 높은 확률로, 변수로 어떤 함수의 return 값을 받고, 그 변수가 리스트 또는 넘파이어레이, 사전일 것이라고 가정하고, 그 변수의 원소를 [ ] 로 접근하려 하는데 에러가 발생하는 경우가 많다.

>>> def func(n):
	if n == 1:
		return [1,2,3]
	elif n == 2:
		return [4,5,6]

	
>>> a = func(1)
>>> a[1]
2
>>> a = func(3)
>>> a[1]
Traceback (most recent call last):
  File "<pyshell#17>", line 1, in <module>
    a[1]
TypeError: 'NoneType' object is not subscriptable

아주 간단한 예제를 만들어 보았는데, func 함수는 1, 2 가 입력으로 들어왔을 때에는 리스트를 반환한다. 그래서, func 의 결과를 a 에 저장하고, a[1] 을 사용하고자 하는 코드이다.

그런데, func(3) 를 수행했을 때에는, 함수의 분기조건을 다 통과하고 func 을 나오게 된다. 이렇게 return 문 없이 함수를 나올 때에는 파이썬은 디폴트로 None 을 반환하게 된다. 따라서, a 에는 None 이 저장되게 되고, 이 때 a[1] 을 시행하면, NoneType object is not subscriptable 에러가 발생하게 된다.

728x90