한 개만 더, 한 발만 더

어제보다 조금 더 나은 오늘을 만들기 위해 노력합니다.

파이썬/에러 코드

[Python] 'NoneType' object is not iterable

토이판다 2019. 12. 23. 18:29

Cambodia 2019

 

다음은 Python에서 input 관련 연습 중 알게 된 내용이다.

 

// 원래 문제

 

taco를 주세요

메뉴 중 하나를 선택해서 출력하는 코드인데, 사용자에게 메뉴를 입력받는 부분을 추가하고(1 - 5줄) 실행해 보았더니 아래와 같은 오류가 발생했다.

 

역시 그렇지

foods에 food를 append해서 출력했는데 왜 리스트가 NoneType이 되지...?

 

주피터 노트북에서 한줄씩 실행해 보았다.

 

왜 사라져 버리는 것일까

왜 리스트에 요소를 추가해서 다시 담았는데 NoneType이 되는 것일까...?

 

주피터 노트북 46라인을 보면 append 메서드는 None을 return하는 것을 알 수 있다.

 

return된 None을 다시 foods에 담았기 때문에 foods 리스트가 None이 되어버린 것.

 

// 예제 1

 

두 개를 각각 print해서 다시 한번 알아보자.

 

오묘하다

print(list.append('d')는 None이고, append된 이후 호출된 print(list)는 ['a', 'b', 'c', 'd']가 출력된다.

 

이런 현상이 발생하는 이유는 list가 mutable이기 때문이다.

 

mutable/immutable은 변수가 함수의 매개변수로 전달될 때 원래 입력 변수값이 변경되는지 여부를 말하는데, Call-By-Value&Call-By-Reference*와 동일한 개념이다.

(자바스크립트의 배열을 다루는 함수들과 어떻게 다르게 동작하는지 공부해 볼 필요가 있다.)

 

[Python]

- mutable: list, dictionary, set

- immutable: number, string, tuple

 

*참고: https://edu.goorm.io/learn/lecture/201/%EB%B0%94%EB%A1%9C-%EC%8B%A4%ED%96%89%ED%95%B4%EB%B3%B4%EB%A9%B4%EC%84%9C-%EB%B0%B0%EC%9A%B0%EB%8A%94-c%EC%96%B8%EC%96%B4/lesson/412515/call-by-value-and-call-by-reference

 

다른 예제로 한번 더 확인해본다.

 

// 예제 2

a와 b의 차이점

숫자 10을 담았던 a는 test1 함수에서 호출한 뒤에 print(a)를 해도 그대로 10이 출력된다.

그러나 빈 리스트 b는 test2 함수에서 l.append('apple')이 된 후 출력하면 apple이 append된 상태로 출력된다.

즉, test2(b)와 print(b)의 결과가 같은 것을 알 수 있다.

 

해결!

아래와 같이 수정하여 정상적인 작동이 가능하다.

 

// 원래 문제

 

'> '가 되어야 하는데..