본문 바로가기

Python/Intermediate

[Python] 고급 - Dict 및 Set(2)

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