Python은 모든 것이 객체다.
파이썬은 크게 불변 객체(Immutable Object)와 가변 객체(Mutable Object)로 구분할 수 있다.
| 클래스 | 불변 객체 |
| bool | o |
| int | o |
| float | o |
| list | x |
| tuple | o |
| str | o |
| set | x |
| dict | x |
불변 객체 (Immutable Object)
파이썬에서 변수를 할당하는 것은 객체에 대한 "참조"를 한다는 의미.
모든 객체는 메모리 상에 위치해 있고, 변수는 해당 객체의 주소를 가리킨다.
int, str 등의 변수가 할당되면, 변수가 가리키는 주소는 변경될 수 있지만, 주소가 가리키는 객체는 변경될 수 없다.
불변객체가 함수로 전달될 때는 Call by Value
→ 불변객체는 값이 변경될 수 없으므로 !
가변 객체 (Mutable Object)
가변 객체는 객체의 값이 변경될 수 있음을 의미.
int, str 등의 불변 객체와 달리, list는 변수가 참조하는 객체의 값이 변경될 수 있다.
아래의 코드 예시를 보자.
a 라는 변수는 리스트 자료형이다.
b 라는 변수는 a 변수와 같은 주소를 가리킨다.
리스트는 가변객체이므로, a[2]가 0으로 변경될 수 있다.
a와 b는 같은 주소를 가리키므로, b의 리스트 내용도 변경된 것을 알 수 있다.
가변객체가 함수로 전달될 때는 Call by Reference
→ 가변객체는 값이 변경될 수 있으므로 !
>>> a = [1,2,3,4,5]
>>> b = a
>>> b
[1, 2, 3, 4, 5]
>>> a[2]=0
>>> a,b
([1, 2, 0, 4, 5], [1, 2, 0, 4, 5])
Deep Copy vs Shallow Copy
Deep Copy는 해당 객체와 인스턴스까지 모두 복사하여 새로운 주소에 할당한다. => Call by Value
주소를 공유하지 않고, 아예 새로운 변수가 된다.
python에서 copy 모듈을 임포트하여 사용
import copy
a = [1,2,3]
b = copy.deepcopy(a)
또는 아래 방식들로 Deep Copy가 가능하다.
참고로, 수행 시간 기준으로 나열한 것이다.
주의 : 2차원 이상의 다차원 리스트는 deepcopy 모듈만 가능하다.
a = [1,2,3]
b1 = a[:] # 슬라이싱, 깊은 복사
b2 = []
b2.extend(a) # extend(), 리스트를 추가하는 함수, 깊은 복사
b3 = list(a) # list(), 깊은 복사
import copy
b4 = copy.copy(a) # copy 모듈, 깊은 복사
b5 = [i for i in a] # 리스트 컴프리헨션, 깊은 복사
import copy
b6 = copy.deepcopy(a) # 리스트 원소까지도 깊은 복사, 가장 느림
Shallow Copy는 객체만 복사하기 때문에, 같은 주소를 가리킨다. => Call by Reference
즉, 원본이 변경되면 복사본도 변경되고, 그 반대도 그렇다.
단순히 변수를 통해 할당하는 방식
a = [1,2,3]
b = a
알아두면 매우 좋은 2차원 배열 선언 방식 !
python으로 10*10 크기의 2차원 배열을 선언하는 방식은 다음 두 가지가 있다.
A = [[0 for i in range(10)] for j in range(10)]
B = [[0]*10]*10
실제로 A == B 를 체크하면 True를 리턴한다.
하지만, 두 변수에는 차이가 있다.
B의 * 연산은 리스트를 "Shallow Copy"한다.
따라서, B의 첫 번째 list가 [1,1,1,1,1,1,1,1,1,1]로 변경되면, B의 나머지 list도 전부 1로 변경된다.
A의 for문을 이용한 list comprehension 방식을 사용하라!!
'Language > Python' 카테고리의 다른 글
| 6. 파이썬 input 읽기 - 백준 사이트에서 필수 사용! (0) | 2021.08.11 |
|---|---|
| 5. 파이썬 PriorityQueue vs heapq (0) | 2021.08.08 |
| 4. 딕셔너리 key에 value추가하기 (0) | 2021.08.05 |
| 3. 파이썬 Deque 데크 자료형 (0) | 2021.07.27 |
| 2. 파이썬 딕셔너리 모듈 defaultdict, Counter (0) | 2021.07.22 |
댓글