Immutable Dict
# immutable Dict
from types import MappingProxyType
d = {'key1': 'value1'}
f = d
print('f = d : ', d is f, d == f) # is 는 id 가 같은지 확인, == 는 값이 같은지 확인
print('value & id: ', d, id(d))
print('value & id: ', f, id(f))
print()
# Read Only(Immutable Dict 생성)
d_frozen = MappingProxyType(d)
print(d, id(d), type(d))
print(d_frozen, id(d_frozen), type(d_frozen))
print(d is d_frozen, d == d_frozen) # is 는 id 가 같은지 확인, == 는 값이 같은지 확인
d['key1'] = 'value2'
print(d, id(d))
--------------------------------------------[result]
f = d : True True
value & id: {'key1': 'value1'} 2229533189680
value & id: {'key1': 'value1'} 2229533189680
{'key1': 'value1'} 2229533189680 < class 'dict'>
{'key1': 'value1'} 2229544075384 < class 'mappingproxy'>
False True
{'key1': 'value2'} 2229533189680
수정 가능 여부 확인
# 수정 가능
d['key2'] = 'value2'
print(d)
# 수정 불가, mappingproxy 타입으로 수정불가.
print()
print('type: ', type(d_frozen))
d_frozen['key1'] = 'value2'
--------------------------------------------[result]
{'key1': 'value2', 'key2': 'value2'}
type: <class 'mappingproxy'>
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-15-9c62d903ed8b> in <module>
6 print()
7 print('type: ', type(d_frozen))
----> 8 d_frozen['key1'] = 'value2'
TypeError: 'mappingproxy' object does not support item assignment
Immutable Set
s1 = {'Apple', 'Orange', 'Apple', 'Orange', 'Kiwi'}
s2 = set(['Apple', 'Orange', 'Apple', 'Orange', 'Kiwi'])
s3 = {3}
s4 = set() # Not {} 이렇게 하면 dict 타입이 됨.
s0 = {}
print('s0 = {}:', type(s0)) # dict 타입임을 주의할 것
s5 = frozenset({'Apple', 'Orange', 'Apple', 'Orange', 'Kiwi'})
# 추가
s1.add('Melon')
# 추가 불가
# s5.add('Melon')
--------------------------------------------[result]
s0 = {}: <class 'dict'>
# s1 ~ s4 set 타입
print(s1, type(s1))
print(s2, type(s2))
print(s3, type(s3))
print(s4, type(s4))
print(s5, type(s5)) # frozenset 타입
--------------------------------------------[result]
{'Kiwi', 'Apple', 'Melon', 'Orange'} <class 'set'>
{'Kiwi', 'Apple', 'Orange'} <class 'set'>
{3} <class 'set'>
set() <class 'set'>
frozenset({'Kiwi', 'Apple', 'Orange'}) <class 'frozenset'>
선언 최적화, 파이썬의 내부적인 동작 절차
# 선언 최적화
# 바이트코드 -> 파이썬 인터프리터 실행
from dis import dis
print('------')
print(dis('{10}'))
print('------')
print(dis('set([10])'))
--------------------------------------------[result]
------
1 0 LOAD_CONST 0 (10)
2 BUILD_SET 1
4 RETURN_VALUE
None
------
1 0 LOAD_NAME 0 (set)
2 LOAD_CONST 0 (10)
4 BUILD_LIST 1
6 CALL_FUNCTION 1
8 RETURN_VALUE
None
'Python > Intermediate' 카테고리의 다른 글
[Python] Closure (0) | 2021.05.25 |
---|---|
[Python] 일급함수 (0) | 2021.05.24 |
[Python] 고급 - Dict 및 Set(1) (0) | 2021.05.23 |
[Python] 고급 - 리스트 및 튜플(2) (0) | 2021.05.23 |
[Python] 고급 - 리스트 및 튜플(1) (0) | 2021.05.22 |