일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- network
- MongoDB
- 앱테크
- Linux
- Python
- DocumentDB
- 하나머니
- AWS
- MongoEngine
- 재테크
- 커피머니불리기
- docker
- 리워드앱
- aws codecommit
- S3
- 실사용
- clone
- docker network
- Container
- 토스카드
- codecommit
- 리뷰
- 도커
- namespace
- 포인트앱
- 후기
- python3
- VPC
- mininet
- built-in
- Today
- Total
ㅍㅍㅋㄷ
python 3와 python 2의 dictionary 차이 - view object 본문
python 3와 python 2의 dictionary 차이 - view object
python 3로 가면서 python 2에 비해 여러가지가 변경되었다.
그 중에 python 3에서 새롭게 생긴 dictionary의 view object 에 대해서 알아 보려 한다.
Dictionary 메서드 - items() / keys() / values()
python에서 dictionary 를 탐색할때 가장 많이 하는 행위 중 하나가 바로 for문을 통해 key와 value 값을 가져오는 것일 것이다.
dic = {'a': 100, 'b': 50, 'c': 10, 'd': 500}
for k,v in dic.items():
print("key=%s, value=%s" %(k,v))
>>> key=a, value=100
>>> key=d, value=500
>>> key=c, value=10
>>> key=b, value=50
items() 는 dictionary 의 key와 value 값을 가져오는 메서드이다.
items() 메서드 외에도 key 값만 가져오는 keys() 와 value 값을 가져오는 values() 메서드도 있다.
그런데 dictionary 에서 제공되는 메서드를 사용할 때 python 3는 기존의 python 2와 약간의 차이를 보인다.
아래 python 3 일때 items, keys, values 메서드를 사용할때 반환되는 결과를 보자.
dic = {'a': 100, 'b': 50, 'c': 10, 'd': 500}
dic.items()
>>> dict_items([('c', 10), ('a', 100), ('b', 50), ('d', 500)])
dic.keys()
>>> dict_keys(['c', 'a', 'b', 'd'])
dic.values()
>>> dict_values([10, 100, 50, 500])
Python 2 일때는 아래와 같다.
dic = {'a': 100, 'b': 50, 'c': 10, 'd': 500}
dic.items()
>>> [('a', 100), ('c', 10), ('b', 50), ('d', 500)]
dic.keys()
>>> ['a', 'c', 'b', 'd']
dic.values()
>>> [100, 10, 50, 500]
언뜻 보면 큰 차이 없어보이지만, 결과값의 type을 확인해 보면 실체가 완전히 다른것을 알 수 있다.
# Python 3
type(dic.values())
>>> <class 'dict_values'>
# Python 2
type(dic.values())
>>> <type 'list'>
items() 나 keys() 의 type을 보면 아래와 같이 dict_items, dict_keys 로 확인 된다.
물론 python2 에서는 메서드에 상관없이 모두 list type으로 반환됨을 확인할 수 있다.
type(dic.items())
>>> <class 'dict_items'>
type(dic.keys())
>>> <class 'dict_keys'>
간단히 생각했을때, python 2에서 처럼 list 로 반환해 주면 훨씬 사용하기 심플할 것이다.
근데 python 3에서는 왜 이런 추가적인 class를 만든 것일까.
Dictionary view objects
python docs 에서는 이것을 view object 라고 설명한다.
아래 자세한 내용을 확인해 보자.
The objects returned by dict.keys(), dict.values() and dict.items() are view objects. They provide a dynamic view on the dictionary’s entries, which means that when the dictionary changes, the view reflects these changes.
Dictionary views can be iterated over to yield their respective data, and support membership tests:
view object를 만든 가장 큰 이유는 dictionary의 동적 변경을 반영해 처리하기 위해서라고 설명한다.
이것이 무엇을 의미하는 것인지 알아볼 필요가 있다.
먼저 python 2에서 아래 상황을 살펴보자.
dic = {'a': 100, 'b': 50, 'c': 10, 'd': 500}
dic_values = dic.values()
dic_values
>>> [100, 10, 50, 500] # List type
먼저 python 2에서는 values() 메서드를 사용해 dictionary 의 value 값만 취하게 되면 위와 같이 list type 으로 값을 반환하게 된다.
이때, 본래 dictionary 의 값, 해당 예제에서는 dic 변수 값 중 하나를 변경해보자.
dic['a'] = 1
dic
>>> {'a': 1, 'c': 10, 'b': 50, 'd': 500}
key가 'a' 인 값을 1로 변경하였다.
하지만, 이전에 values() 메서드를 통해 value 값만 가져와 저장했던 dic_values 값은 어떨까.
dic_values
>>> [100, 10, 50, 500]
dic = {'a': 100, 'b': 50, 'c': 10, 'd': 500}
dic_values = dic.values()
dic_values
>>> dict_values([10, 100, 50, 500])
dic['a'] = 1
dic_values
>>> dict_values([10, 1, 50, 500])
dictionary 의 크기에 상관 없이 items() 메서드를 통해 가져온 값은 동일한 메모리 사이즈를 보인다.
python2에서는 어떤지 확인해 보자.
# Python 2
>>> 144
python 2에서는 dictionary 크기에 따라 items() 메서드로 가져온 값의 메모리 사이즈가 다르다. 결과값을 list 로 가져오기 때문이다.
사실, python 2에서도 python 3의 items() 와 동일하게 iterable 한 object로 가져오는 방법을 제공해 준다. 바로 iteritems() 이다.
# Python 2
dic.items()
>>> [('a', 100), ('c', 10), ('b', 50), ('d', 500)]
dic.iteritems()
>>> <dictionary-itemiterator object at 0x7f49c663cc00>
python 3 에서는 python 2에서 제공되던 items() 와 iteritems() 를 items() 메서드 하나로 통합했다고 보면 될 것 같다.
[참고]
- https://docs.python.org/3.3/library/stdtypes.html#dict-views
- https://docs.python.org/3/library/stdtypes.html#mapping-types-dict
'Programming > Python' 카테고리의 다른 글
Python3 - Function annotation 에 대하여 (2) | 2019.06.20 |
---|---|
python 3에서는 f-string이 갑이다. (8) | 2019.05.12 |
python - filter 함수. 어렵지 않아요 (0) | 2019.01.24 |
python eval 과 literal_eval 의 차이 (1) | 2019.01.22 |
python eval() 함수 - 사용을 조심해야 하는 이유 (4) | 2019.01.22 |