<파이썬 알고리즘 인터뷰> 책을 공부하며 정리한 내용입니다.
p. 115 ~ 121
객체
- 파이썬은 모든 것이 객체다. 이 객체는 크게 불변 객체(immutable object)와 가변 객체(mutable object)로 구분할 수 있다.
불변 객체 (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]]
공부는 여러 번 했는데
뭔가 속시원하게 이해가 안되던 개념이었는데,
오늘은 이해에 성공했다! 😙
'컴린이 탈출기 > Python' 카테고리의 다른 글
유닛 테스트(Unit Test)의 중요성과 다양한 작성 예시 (feat. Python) 🕵 (2) | 2022.12.09 |
---|---|
[Python] OOP(Object Oriented Programming) (0) | 2021.04.20 |
[Python] Pythonic한 code 짜기 (0) | 2021.04.19 |