파이썬 소스
>>> addr={}
>>> addr
{}
>>> addr['최재원']='010-1111-1234'
>>> addr
{'최재원': '010-1111-1234'}
>>> addr['최지윤']='010-2222-1234'
>>> addr
{'최재원': '010-1111-1234', '최지윤': '010-2222-1234'}
>>> addr['김연수']='010-3333-12334'
>>> addr
{'최재원': '010-1111-1234', '최지윤': '010-2222-1234', '김연수': '010-3333-12334'}
>>> addr['김연우']='010-4444-1234'
>>> addr
{'최재원': '010-1111-1234', '최지윤': '010-2222-1234', '김연수': '010-3333-12334', '김연우': '010-4444-1234'}
>>> addr['김가현']='010-5555-1234'
>>> addr
{'최재원': '010-1111-1234', '최지윤': '010-2222-1234', '김연수': '010-3333-12334', '김연우': '010-4444-1234', '김가현': '010-5555-1234'}
>>> addr['김혜현']='010-6666-1234'
>>> addr
{'최재원': '010-1111-1234', '최지윤': '010-2222-1234', '김연수': '010-3333-12334', '김연우': '010-4444-1234', '김가현': '010-5555-1234', '김혜현': '010-6666-1234'}
>>> print(addr)
{'최재원': '010-1111-1234', '최지윤': '010-2222-1234', '김연수': '010-3333-12334', '김연우': '010-4444-1234', '김가현': '010-5555-1234', '김혜현': '010-6666-1234'}
>>> print(list(addr.keys()))
['최재원', '최지윤', '김연수', '김연우', '김가현', '김혜현']
>>> name=input('search name: ')
>>> search name: 김연우
>>> print(addr.get(name,'not Found'))
010-4444-1234
<파이썬 소스와 결과 입니다. 소스에 대해 자세히 설명2> 이어서 설명
질문)
딕셔너리 자료형에 데이터를 추가할때 addr['최재원'] = '010-1111-1234'입력했습니다. addr다음에 키값인 ['최재원']은 왜 대괄호로 하나요?
딕셔너리에 데이터를 추가하거나 접근할 때 키 값을 대괄호 []로 감싸는 것은 파이썬의 문법 규칙입니다.
이것은 딕셔너리의 특징인 키(key)를 이용한 데이터 접근 방식을 명확히 보여주는 문법입니다.
딕셔너리와 대괄호의 역할
- 데이터 추가 및 업데이트: addr['최재원'] = '010-1111-1234' 이 코드는 addr 딕셔너리에서 '최재원'이라는 키에 '010-1111-1234'라는 값을 할당하겠다는 의미입니다. 만약 '최재원'이라는 키가 이미 존재하면 값이 업데이트되고, 없으면 새로운 키-값 쌍이 추가됩니다.
- 값 조회: print(addr['최재원']) 이 코드는 addr 딕셔너리에서 '최재원'이라는 키에 해당하는 값을 찾아 출력하라는 명령입니다.
대괄호 []는 파이썬에서 시퀀스(sequence)나 매핑(mapping) 자료형의 특정 요소에 접근할 때 사용하는 인덱싱(indexing) 연산자입니다.
- 리스트(List): my_list = ['a', 'b', 'c'] 에서 my_list[0]은 첫 번째 요소인 'a'를 가리키는 것처럼, 인덱스 번호를 사용해 접근합니다.
- 딕셔너리(Dictionary): 리스트와 달리 인덱스 번호가 아닌 고유한 키를 사용하여 값에 접근합니다. 이 키를 대괄호 [] 안에 넣어 '이 키에 해당하는 값을 찾아줘'라고 명령하는 것입니다.
따라서, addr['최재원']에서 대괄호는 '최재원'이라는 키를 지정하여 딕셔너리의 특정 위치를 가리키는 역할을 합니다.
추가질문)
print(addr.keys())
dict_keys(['최재원', '최지윤', '김연수', '김연우', '김가현', '김혜현'])
print(list(addr.keys()))
['최재원', '최지윤', '김연수', '김연우', '김가현', '김혜현']
list를 넣고 빼고의 차이는 무엇인지 설명해주세요.
list()를 사용하고 안 하고의 차이는 출력되는 자료형이 다르다는 점입니다. addr.keys()는 딕셔너리의 키들을 보여주는 특수한 뷰(view) 객체를 반환하는 반면, list(addr.keys())는 이 뷰 객체를 우리가 흔히 사용하는 리스트(list) 자료형으로 변환합니다.
뷰 객체 (dict_keys)
print(addr.keys())의 결과인 dict_keys(['최재원', '최지윤', ...])는 딕셔너리의 키들을 실시간으로 보여주는 객체입니다.
- 이 객체는 리스트처럼 보이지만, 실제로 리스트는 아닙니다.
- dict_keys는 딕셔너리와 '링크'되어 있어서, 딕셔너리에 키가 추가되거나 삭제되면 이 객체에도 그 변화가 자동으로 반영됩니다.
- 이 객체 자체는 인덱싱([0])이나 슬라이싱([1:3]) 같은 리스트의 기능을 직접 사용할 수 없습니다.
리스트 (list)
print(list(addr.keys()))의 결과인 ['최재원', '최지윤', ...]는 딕셔너리의 키들을 새로운 리스트로 복사한 것입니다.
- 이 리스트는 dict_keys 객체와 달리 딕셔너리와의 연결이 끊어져 있습니다. 딕셔너리에 변경이 생겨도 이 리스트는 그대로 유지됩니다.
- 리스트이므로 인덱스를 사용한 요소 접근(['최재원', '최지윤'][0])이나 슬라이싱, 정렬 등 리스트가 제공하는 모든 기능을 사용할 수 있습니다.
| dict_keys (뷰 객체) | list (리스트 자료형) | |
| 생성 방법 | addr.keys() | list(addr.keys()) |
| 자료형 | <class 'dict_keys'> | <class 'list'> |
| 딕셔너리와의 관계 | 연동됨 (실시간 반영) | 연동되지 않음 (복사본) |
| 활용성 | 반복문 등 단순 조회에 유용 | 인덱싱, 슬라이싱 등 다양한 작업에 유용 |
여기서 중요한 내용은 뷰객체는 연동되어 실시간 반영이고,
list는 연동되지 않음(복사본) 이라는 것이다.
중요질문)
키값만 깔끔하게 출력하려면 list를 넣어서 출력하는 것도 코딩의 한 기법이겠네요.
네, 맞습니다. 딕셔너리의 키 값만 깔끔하게 출력하고 싶을 때 list() 함수를 사용하는 것은 매우 흔하고 유용한 코딩 기법입니다.
list()를 사용하는 이유
addr.keys()만으로도 딕셔너리의 키를 얻을 수 있지만, 그 결과는 dict_keys라는 특별한 뷰 객체입니다. 이 객체는 리스트처럼 보이지만, 리스트의 모든 기능을 가지고 있지 않습니다.
반면, list(addr.keys())는 dict_keys 객체를 새로운 리스트로 변환합니다. 이렇게 하면 다음과 같은 장점들이 생깁니다.
- 가독성: ['최재원', '최지윤', ...]처럼 우리가 익숙한 리스트 형태로 출력되어 더 직관적이고 깔끔해 보입니다.
- 활용성: 리스트로 변환하면 인덱싱, 슬라이싱, 정렬 등 다양한 리스트 메서드를 사용할 수 있어 데이터 처리가 훨씬 편리해집니다.
- 독립성: 리스트로 변환된 데이터는 원래 딕셔너리와 별개이므로, 딕셔너리에 변화가 생겨도 이 리스트는 그대로 유지됩니다.
따라서 딕셔너리의 키를 단순히 출력하거나, 추가적인 처리를 해야 할 때 list()를 사용하는 것은 파이썬 프로그래밍의 좋은 관행이자 효율적인 기법입니다.
간단 질문) list를 넣으면 dict_keys이 메시지는 빠져서 깔끔하게 출력된다는거죠?
네, 맞습니다. list()를 사용하면 dict_keys라는 메시지가 사라지고, 깔끔하게 키 목록만 출력됩니다.
print(addr.keys())는 딕셔너리 뷰 객체인 dict_keys 자체를 출력하기 때문에 그 객체의 이름이 포함되어 보입니다.
반면, print(list(addr.keys()))는 dict_keys 뷰 객체에서 실제 키 값만 추출하여 새로운 리스트를 만들고 그 리스트를 출력하는 겁니다. 이 과정에서 dict_keys라는 정보는 사라지고, 순수한 값만 담긴 리스트만 남게 되는 거죠.
따라서 키 값만 깔끔하게 보고 싶을 때 list()를 사용하는 것은 아주 좋은 방법입니다.
참고질문)
view object, 뷰객체라고 표현하는데, 여기서 뷰는 실시간으로 보여준다고 해서 뷰가 붙는건가요?
네, 맞습니다.
'뷰(view)'라는 이름은 실시간으로 원본 객체(딕셔너리)의 상태를 '바라보고' 있기 때문에 붙은 이름입니다. 뷰 객체는 원본 데이터의 복사본이 아니라, 원본 데이터에 대한 '창문'과 같다고 생각할 수 있습니다.
뷰 객체의 특징
- 실시간 반영: 딕셔너리에 새로운 키를 추가하거나 기존 키를 삭제하면, dict_keys 뷰 객체도 자동으로 그 변화를 반영합니다.
- 메모리 효율성: 딕셔너리가 매우 클 때, 키 목록 전체를 복사하는 것보다 뷰 객체를 사용하는 것이 메모리를 훨씬 절약할 수 있습니다.
- 읽기 전용: 뷰 객체는 원본 딕셔너리를 변경할 수 없으며, 단순히 그 내용을 '바라만' 볼 수 있습니다.
예를 들어, addr 딕셔너리에 새로운 전화번호를 추가하면 addr.keys()가 반환한 뷰 객체도 즉시 업데이트됩니다.
addr = {'김연우': '010-4444-1234'}
keys_view = addr.keys()
print(keys_view)
# dict_keys(['김연우'])
addr['최재원'] = '010-1111-1234' # 딕셔너리 변경
print(keys_view)
# dict_keys(['김연우', '최재원']) # 뷰 객체도 실시간으로 변경된 것을 볼 수 있습니다.
중요 개념 정리)
my_dict = {'a': 1, 'b': 2}에서 my_dict는 키와 값을 모두 저장하는 딕셔너리 자료형입니다.
딕셔너리와 뷰 객체의 차이점
- 딕셔너리 (my_dict):
- 자료형: my_dict = {'a': 1, 'b': 2}는 딕셔너리(dict) 자료형입니다.
- 역할: 키와 값 쌍을 실제로 저장하는 원본 데이터 컨테이너입니다. 키를 사용해 값에 직접 접근하거나, 값을 추가/수정/삭제하는 모든 작업을 수행할 수 있습니다.
- 출력: print(my_dict)를 하면 현재 딕셔너리에 저장된 모든 키와 값 쌍을 보여줍니다.
- 뷰 객체 (my_dict.keys(), my_dict.values(), my_dict.items()):
- 자료형: 딕셔너리의 .keys(), .values(), .items() 메서드를 호출했을 때 반환되는 특별한 객체입니다. 각각 dict_keys, dict_values, dict_items 타입입니다.
- 역할: 원본 딕셔너리의 특정 부분(키, 값, 또는 항목)을 실시간으로 '바라보는' 역할을 합니다. 뷰 객체 자체는 데이터를 저장하지 않고, 원본 딕셔너리의 변화를 즉시 반영하는 '창문'과 같습니다.
쉽게 말해, 딕셔너리는 '집' 자체이고, 뷰 객체는 그 집의 '주소록'이나 '집에 있는 가구 목록'을 보여주는 문서입니다. 문서를 수정한다고 해서 집이 바뀌진 않지만, 집에 가구를 추가하면 문서에도 자동으로 반영되는 것과 같습니다.
최종 정리 질문)
.key()메서드, .values()메서드, .items()메서드를 호출하면 해당 메서드의 결과값들이 반환되는 객체들, 그 해당 객체는 dict_keys, dict_values, dict_items 이 타입들이 반환되는 객체들 이라는 뜻인가요?
네, 정확히 이해하셨습니다. 👍
dict.keys(), dict.values(), dict.items() 메서드를 호출하면, 그 결과로 각각 dict_keys, dict_values, dict_items라는 뷰 객체가 반환됩니다.
각 메서드와 반환 객체
각 메서드는 딕셔너리의 특정 부분을 '바라보는' 뷰 객체를 생성합니다.
- dict.keys(): 딕셔너리의 모든 키(key)들을 보여주는 dict_keys 타입의 뷰 객체를 반환합니다.
- dict.values(): 딕셔너리의 모든 값(value)들을 보여주는 dict_values 타입의 뷰 객체를 반환합니다.
- dict.items(): 딕셔너리의 모든 키-값 쌍(item)을 (키, 값) 형태의 튜플로 보여주는 dict_items 타입의 뷰 객체를 반환합니다.
이 뷰 객체들은 모두 원본 딕셔너리와 연결되어 있어서, 딕셔너리에 변화가 생기면 뷰 객체도 실시간으로 업데이트됩니다. 이는 데이터의 복사본을 만드는 것보다 훨씬 효율적입니다.
딕셔너리에 변화가 생겼을 때 뷰 객체도 실시간으로 업데이트된다는 것은, 딕셔너리와 뷰 객체가 서로 연동되어 있다는 의미입니다. 뷰 객체는 원본 데이터의 복사본이 아니라, 원본 딕셔너리를 직접 '바라보는' 역할을 하므로 이런 실시간 연동이 가능합니다.
이러한 특성 때문에 뷰 객체는 메모리를 효율적으로 사용하고, 항상 최신 데이터를 보여줄 수 있다는 장점이 있습니다.
'파이썬(Python)' 카테고리의 다른 글
| 파이썬, 선택문, if~elif / if~elif ~else문 소스 및 소스 해석 (0) | 2025.08.21 |
|---|---|
| 파이썬에서 선택문의 종류는 무엇이 있는지 정리 및 if문 (0) | 2025.08.21 |
| 파이썬, 문제풀이 / 친구 등록, 검색, 검색 후 출력 프로그램(1 of 2) (0) | 2025.08.20 |
| 파이썬, len()함수에 대해 예제와 함께 자세히 정리 (1) | 2025.08.19 |
| 파이썬, 세트 연산(세트 합집합, 교집합, 차집합) (4) | 2025.08.19 |
콘텐츠 내 자동삽입광고
