파이썬의 요상한 문법 문제
파이썬에는 딕셔너리라는게 있는데, 참 편리한 놈이다. 여기서 원소를 불러오려면 pop과 get메소드 중에 하나를 쓰면 되는데...
a={'abc':1}
for i in range(10):
print a.pop('abc')
위와 같은 코드는 에러가 난다.
a={'abc':1}
for i in range(10):
print a.get('abc')
그러나 위와 같은 코드는 에러가 나지 않는다. 대체 뭐지...
위의 문제는 get과 pop의 작동 방식 차이에서 오는 것이다. get은 해당 키워드의 값을 되돌려주고 원래 자료에는 아무 일도 하지 않는다. 하지만 pop은 해당 키워드의 값을 꺼내서 되돌려주고 원래 자료에서는 없애 버린다. get은 얻어오는거고 pop은 뽑아오는 것. 이게 왜 이렇게 되었냐면, 원래 pop은 배열을 스택처럼 쓰기 위해서 그런거라 카더라.
---
다음과 같은 일도 있다.
class mytest():
m=[]
def __init__(self, **kwds):
self.m=[]
self.m+=[kwds.pop('xyz')]
mya=[]
for i in range(10):
mya+=[mytest(xyz=i).m]
print mya
위의 코드와
class mytest():
m=[]
def __init__(self, **kwds):
self.m+=[kwds.pop('xyz')]
mya=[]
for i in range(10):
mya+=[mytest(xyz=i).m]
print mya
위의 코드는 결과값이 다르다. 차이는 init 안에서 self.m이 있느냐 없느냐의 차이인데. 왜 차이가 나는지 모르겠다. 객체지향 따위는 갖다 버린 파이썬 같으니라고...