다음은 Python에서 input 관련 연습 중 알게 된 내용이다.
// 원래 문제
메뉴 중 하나를 선택해서 출력하는 코드인데, 사용자에게 메뉴를 입력받는 부분을 추가하고(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
다른 예제로 한번 더 확인해본다.
// 예제 2
숫자 10을 담았던 a는 test1 함수에서 호출한 뒤에 print(a)를 해도 그대로 10이 출력된다.
그러나 빈 리스트 b는 test2 함수에서 l.append('apple')이 된 후 출력하면 apple이 append된 상태로 출력된다.
즉, test2(b)와 print(b)의 결과가 같은 것을 알 수 있다.
해결!
아래와 같이 수정하여 정상적인 작동이 가능하다.
// 원래 문제
'파이썬 > 에러 코드' 카테고리의 다른 글
[Excel] SUMIF 함수에 대한 재미있는 사실 (0) | 2020.04.03 |
---|---|
[Python] Django Static Files & Deploy (0) | 2020.02.04 |
[Python] UnboundLocalError (0) | 2019.12.25 |
[Github] API KEY 노출 문제 (0) | 2019.12.10 |
[Pipenv] django pipenv와 새 컴퓨터 (0) | 2019.12.10 |