WjExplor Story

[점프 투 파이썬] 2장 자료형 되새김 문제 Q8 ~ Q12 본문

Python/Python : Code Study

[점프 투 파이썬] 2장 자료형 되새김 문제 Q8 ~ Q12

더블유제이플로어 2025. 9. 10. 00:13

Q8. 튜플 더하기

(1,2,3) 튜플에 값 4를 추가하여  (1,2,3,4)를 만든 후 출력해 보자.
a = (1,2,3)
a= a+(4,)
print(a)

Q9. 딕셔너리의 키 

다음과 같은 딕셔너리 a 가 있다.
>>> a = dict()
>>> a
{}
다음 중 오류가 발생하는 경우를 고르고, 그 이유를 설명해 보자.
a ['name'] = 'python'
a[('a',)] = 'python'
a[[1]] = 'python'
a [250] = 'python'

a[[1]] = 'python'

 

해당 문법을 적용하면 list 가 아니라는 오류가 발생한다.

a [1] = 'python'은 가능하나, a[[1]] = 'python'가 안 되는 이유는 리스트(list)는 딕셔너리의 키(key)가 될 수 없기 때문이다.


딕셔너리의 키가 될 수 있는 조건

딕셔너리의 키는 해시 기능(hashable)을 해야 한다. ' 해시 가능하다'는 것은 값이 변하지 않는(immutable) 객체여야 한다는 뜻이다. 파이썬은 키를 고유한 숫자 값(해시 값)으로 변환해서 데이터를 저장하는데, 만약 키가 변할 수 있는 객체라면 이 해시 값이 불안정해서 딕셔너리가 제대로 작동하지 않는다.

* a ['name'] = 'python' : 문자열을 변하지 않기 때문에 키가 될 수 있다.

   a[('a',)] = 'python' : 튜플(tuple) 은 그 안에 있는 값이 변하지 않으면(예: 문자열, 숫자 등) 변하지 않으므로 키가 될 수 있다.

   a [250] = 'python' : 정수는 변하지 않기 때문에 키가 될 수 있다.

* a[[1]] = 'python' :리스트(list)는 append(), pop() 등으로 안에 있는 값을 자유롭게 추가하거나 삭제할 수 있다. 즉, 값이 변할 수 있는(mutable) 객체이다. 따라서 리스트는 해시 값이 불안정해져서 딕셔너리의 키로 사용할 수 없다.

* a[[1]] 자체는 문법 오류이다. a가 리스트여도 a [1]로 데이터를 확인하거나 삽입/수정해야 한다. -Gemini- 


Q10. 딕셔너리 값 추출하기

딕셔너리 a에서 'B'에 해당하는 값을 추출해 보자 (* 딕셔너리의 pop의 함수를 사용해 보자)
a={'A':90, 'B':80, 'C':70}
result=a.pop('B')
print(a) # {'A':90, 'C':70}
print(result) #80

Q11. 리스트에서 중복 제거하기

a 리스트에서 중복 숫자를 제거해 보자.
a=[1,1,1,2,2,3,3,3,4,4,5]
b= list(set(a))
print(b)

Q12. 파이썬 변수

파이썬은 다음처럼 동일한 값에 여러 개의 변수를 선언할 수 있다. 다음과 같이 a, b 변수를 선언한 후 a의 두 번째 요 솟값을 변경하면 b 값은 어떻게 될까? 그리고 이런 결과가 나타나는 이유를 설명해 보자.
a = b = [1,2,3]
a [1] = 4
print(b)

b= [1,4,3] 이 출력된다. a와 b는 동일한 주솟값을 가지고 있기 때문이다.

a:b = [1,4,3]으로 출력되는 이유는 파이썬에서 a와 b 가 동일한 리스트를 가리키는 참조(reference) 이기 때문이다.

변수와 객체 (Variables and Objects)

파이썬에서는 변수는 실제 값을 담는 상자가 아니라 , 메모리에 있는 객체(object)를 가리키는 이름표와 같다.

  1. a = b = [1,2,3] 코드가 실행되면 , 메모리에는 하나의 리스트 객체 [1,2,3]가 생성된다.
  2. a와 b라는 두 개의 이름이 이 하나의 리스트 객체를 동시에 가리키게 된다.

이것은 마치 한 장의 종이에 "집"이라는 이름표를 두 개 붙여놓은 것과 같다. 두 이름표는 모두 같은 집을 가리킨다.

가변성(Mutability)의 역할

리스트는 가변(mutable) 객체이다. 즉, 리스트 안에 있는 요소의 값을 바꿀 수 있다는 뜻이다.

  • a [1] = 4 코드는 a 가 가리키는 리스트의 객체의 두 번째 요소(인덱스 1)를 4로 변경하라는 명령이다
  • 이때 새로운 리스트를 가리키고 있으므로, a를 통해 변경된 내용이 b에도 그대로 반영되는 것이다.

불변성(Immutability) 과의 차이

만약 숫자나 문자열처럼 불면(immutable) 객체를 사용했다면 결과는 달랐을 것이다.

x=y=5
x=6
print(y) #5

이 코드에서는 y는 5가 출력이 된다. x=6을 실행할 때 파이썬은 기존 객체 5를 바꾸는 대신, 새로운 객체 6을 만들고 x가 그것을 가리키게 한다. 하지만 y는 여전히 원래 5를 가리키고 있기 때문에 영향을 받지 않는다.


불변성(Immutability)과 가변성(Mutability)의 차이를 더 깊게 알아보자. 핵심은 객체를 수정하는 행위가 메모리에서 어떤 변화를 일으키는 가에 있다.

1. 가변 객체 (Mutable Objects): list, dictory , set

가변 객체는 말 그대로 '변경 가능한' 객체이다. 객체 자체의 내용물을 그 자리에서 (in-place) 바꿀 수 있다.

  • 메모리 동작 : 객체가 메모리의 특정 주소에 저장되어 있다. 이 객체를 수정하면, 메모리의 주소는 그대로 유지한 채 내용물만 바뀐다.
a = [1, 2, 3]  # 메모리 주소: 100번지 (가정)
print(id(a))   # a의 메모리 주소 출력

a[1] = 4       # 100번지 객체의 내용물을 [1, 4, 3]으로 변경
print(id(a))   # 변경 후에도 메모리 주소는 100번지로 동일
print(a)       # 결과: [1, 4, 3]

id() 함수는 객체의 고유한 메모리 주소를 보여준다. 위 코드에서 a의 id 값은 변하지 않는다.

이것은 마치 화이트보드에 쓴 글씨를 지우개로 지우고 그 위에 덧쓰는 것과 같다. 화이트보드(메모리 주소) 자체는 그대로이지만, 내용물은 바뀐다.

2. 불변 객체 (Immutable Objects) : int, string, tuple

불변 객체는 '변경 불가능한' 객체이다. 객체를 수정하는 것처럼 보이는 모든 행위는 사실 새로운 객체를 생성하는 것이다.

  • 메모리 동작 : 기존 객체의 내용은 절대로 바뀌지 않는다. 변경을 시도하면 파이썬은 기존 객체와 다른 메모리 주소에 새로운 객체를 만들고, 변수가 그 새로운 객체를 가리키도록 연결을 바꿔준다.
x = 5          # 메모리 주소: 200번지 (가정)
print(id(x))   # x의 메모리 주소 출력

x = 6          # 기존 객체(5)를 바꾸는 대신, 새로운 객체(6)를 생성
print(id(x))   # 새로운 메모리 주소(예: 300번지)가 출력됨
print(x)       # 결과: 6

위 코드에서 x 의 id 값은 x= 6 실행한 후 완전히 바뀝니다.

이것은 마치 프린트된 종이 문서와 같다. 문서의 내용을 수정하고 싶으면 기존 종이를 고치는 것이 아니라, 새로운 내용을 담은 종이를 다시 프린트해야 한다.

가변/불변 객체에 각각 사용 용도

  • 가변 객체 : 내용물을 자주 바꿔야 하는 경우에 효율적이다. 예를 들어, 리스트에 요소를 추가하거나 삭제하는 작업은 새로운 리스트를 매번 만들지 않기 때문에 성능에 유리하다.
  • 불변 객체 : 값이 절대 변하지 않는다는 점이 중요할 때 사용된다. 불변 객체는 딕셔너리의 키로 사용할 수 있고, 멀티스레딩 환경에서 예상치 못한 값의 변경을 막아주기 때문에 안전하다.

- Gemini-

https://youtu.be/09KG7YsGuv4?si=a9a891Qir4l7V42m

 

'Python > Python : Code Study' 카테고리의 다른 글

lambda 식 표현  (0) 2025.09.11
[점프 투 파이썬] 3장 제어문 되새김 문제 Q1 ~ Q6  (0) 2025.09.11
Mutable 과 Immutable  (1) 2025.08.31
[점프 투 파이썬] 되새김 문제 Q1 ~ Q7  (1) 2025.08.31
투표 집계하기  (1) 2025.08.01