재밌는 현상을 발견해서 포스팅을 남긴다.
Python으로 class를 지정해서 코딩할 때, 한 클래스 내에서 리스트를 사용할 일이 있어서 다음과 같은 형태로 클래스를 정의했다.
class foo: name = None foo_list = []
해당 클래스의 객체를 여러개 만든 뒤, 들어오는 input에 대해 name을 확인하여 각기 다른 foo 객체의 foo_list에 삽입하도록 했다.
이후 여러 foo 객체를 오가며 foo_list에 삽입된 항목들을 출력하도록 했더니... 오잉? 모든 항목이 동일한 리스트에 들어가 있는 것이 아닌가?
열심히 디버깅 하다가 미심쩍은 부분이 있어서 다음과 같이 변경하였다.
class foo: name = None foo_list = None def __init__ (self): foo_list = []
그러고 나니 각 객체 별로 별도의 리스트를 잘 출력하는 것이었다.
그러니까, class의 멤버 변수를 정의할 때, 초기값을 바로 때려넣어버리면 그게 일종의 static type이 되어서 모든 객체에서 공유하는 멤버 변수가 되는 것이었다. 수정한 코드와 같이 init을 통해 객체가 생성될 때 리스트를 선언하여 사용하면 각 객체 별로 별도의 리스트를 가질 수 있게 되는 것이다.
뭐, 저 용어들이 엄밀하게 따져서 맞는 용어인지는 모르겠다. 어쨌든 내 전문 분야는 C 언어이고, C 언어의 지식으로 해석해봤을 때 저게 static type (혹은 전역변수)으로 보일 뿐이다.
'Tips' 카테고리의 다른 글
MongoDB를 docker에서 돌릴 때 발생가능한 문제점 (0) | 2018.08.29 |
---|---|
undefined reference error (1) | 2018.04.27 |
안드로이드 KITKAT 공장 이미지 (0) | 2014.02.10 |
안드로이드 업데이트 되면서 repo 스크립트가 작동안하는 문제 (0) | 2014.02.08 |
안드로이드 부트로더 문제 (0) | 2013.10.24 |