본문 바로가기

컴린이 탈출기/Python

[Python] 자료형 - 불변 객체와 가변 객체를 중심으로

반응형

<파이썬 알고리즘 인터뷰> 책을 공부하며 정리한 내용입니다.



p. 115 ~ 121

객체

- 파이썬은 모든 것이 객체다. 이 객체는 크게 불변 객체(immutable object)와 가변 객체(mutable object)로 구분할 수 있다. 

frozen set는 뭐냐!

 

 

불변 객체 (immutable object)

- 불변 객체에 해당하는 str, tuple, bytes는 한 번 선언되면, 값을 변경할 수가 없다.

>>> a = 'abc'

>>> id('abc')
4393858752
>>> id(a)
4393858752

>>> a = 'def'
>>> id('def')
4318831648
>>> id(a)
4318831648

 

- str 타입인 abc, def는 생성된 후에 변경된 적이 없고, a 변수가 각기 다른 주소를 참조했음을 알 수 있다.
- 따라서 파이썬에서 변수를 할당하는 작업은 해당 객체에 대해 참조를 한다는 의미라는 것을 알 수 있다.

- 값이 변하지 않기 때문에 dict의 key나 set의 값으로 사용할 수 있다. 반면 list는 언제든 값이 변할 수 있기 때문에 dict의 키, set의 값으로 추가할 수 없다.

 

가변 객체 (mutable object)

- 가변 객체 중 하나로는 리스트가 있다.

- 가변 객체라는 의미는, 다른 변수가 참조하고 있을 때 그 변수의 값 또한 변경된다는 이야기다.

>>> a = [1,2,3,4,5]
>>> id(a)
4393788808

>>> b = a
>>> b
[1,2,3,4,5]
>>> a[2] = 4
>>> a
[1,2,4,4,5]
>>> b
[1,2,4,4,5]

>>> id(a)
4393788808

 

 

+ is와 ==

- is는 id() 값을 비교하는 함수이고, == 는 값을 비교하는 연산자이다.

- None의 경우 null로서 값 자체가 정의되어 있지 않기 때문에 ==로 비교가 불가능하다.

 

+ 얕은 복사 vs. 깊은 복사

얕은 복사

>>> a = [[1,2], [3,4]]
>>> b = a[:]
>>> id(a)
4395624328
>>> id(b)
4396179592
>>> id(a[0])
4396116040
>>> id(b[0])
4396116040

- 슬라이싱은 얕은 복사에 해당한다. id(a)와 id(b)는 다르게 되었지만, 그 안의 객체 id(a[0])과 id(b[0])은 같은 주소를 바라보고 있기 때문이다.

 

>>> a = [[8,9],[3,4]]
>>> b = a[:]

>>> a[1].append(5)
>>> a
[[8, 9], [3, 4, 5]]
>>> b
[[1, 2], [3, 4, 5]]
>>> id(a[1])
4396389896
>>> id(b[1])
4396389896

 - 따라서 a[1] 값을 변경하면 b[1]도 따라서 변경되게 된다.

 

깊은 복사

 - 한편 깊은 복사는 내부의 객체들까지도 모두 새롭게 copy 되는 것이다.

import copy

>>> a = [[1,2],[3,4]]
>>> b = copy.deepcopy(a)
>>> a[1].append(5)
>>> a
[[1, 2], [3, 4, 5]]
>>> b
[[1, 2], [3, 4]]

 

 

공부는 여러 번 했는데
뭔가 속시원하게 이해가 안되던 개념이었는데,
오늘은 이해에 성공했다! 😙

반응형