✳️ 할당 (Assignment)
값을 할당하는 것인데 보통은 오른쪽의 값을 왼쪽 변수에 할당한다 라는 흐름이다.
다양한 할당연산자가 있다.
리스트 a를 b에 할당
a = [1, 2, 3]
b = a
이렇게 a 리스트를 b라는 변수에 할당을 해봤다.
그렇다면 리스트는 2개가 생성된 것일까?
a is b
# True
a와 b가 같다가 true로 나온다.
이름은 다르지만 사실은 같은 리스트로 하나의 리스트에 두 개의 이름.. 이런 식이었다.
b[1] = 10
print(a)
# [1, 10, 3]
print(b)
# [1, 10, 3]
그래서 b 리스트에 1번 인덱스의 값을 10으로 바꿔주면 a와 b를 출력했을 때 모두 값이 변경된다.
그림으로 보자면 이런 식으로 하나의 리스트임을 알 수 있다.
✳️ 복사 (Copy)
.copy( ) 를 사용하여 복사를 시킬 수 있는데 이건 어떤 형태로 리스트가 구성이 되는지 보면
a = [1, 2, 3]
b = a.copy()
a is b
# False
a == b
# True
이렇게 a와 b의 값은 같지만 다른 객체임을 알 수 있었다.
값은 같지만 이름이 다른 두 개의 리스트!
b[1] = 10
print(a)
# [1, 2, 3]
print(b)
# [1, 10, 3]
그래서 값을 교체 해줘도 b 리스트에만 값이 바뀐다.
그림으로 보면 이렇게 리스트가 각각 생긴 것이다.
⚠️ 튜플은 할당은 괜찮지만 복사가 불가하다!
튜플의 경우는 불변 객체이기 때문에 못함!
a = (1, 2, 3)
b = a.copy()
# AttributeError: 'tuple' object has no attribute 'copy'
⭐ 튜플의 할당
a = (1, 2, 3)
b = a
같은 원리로 할당이 된다.
⭐ 튜플의 재할당
a = (1, 2, 3)
b = a
b = (4, 5)
이런 식으로 할당을 하고 다시 변수에 할당을 하는 것을 재할당이라고 하는데
2개의 튜플이 생성되어 서로가 서로에게 영향을 주지 않는다.
✳️ 얕은 복사(Shallow copy)
복사에는 얕은 복사와 깊은 복사의 개념이 따로 있다.
이 둘 간의 차이를 확인해보자.
얕은 복사는 가장 바깥 껍질만 복사한다! 라고 기억하자
먼저 같은 예시로 리스트를 이용하고 copy라는 모듈의 얕은 복사를 사용해본다.
import copy
a = [1, 2, [3, 4]]
b = copy.copy(a)
print(b)
# [1, 2, [3, 4]]
얕은 복사는 copy 모듈의 .copy() 메소드를 이용
그림으로 표현한다면 리스트가 두 개가 생성이 되었고 리스트 내 리스트는 할당이 된 것으로 볼 수 있다.
[리스트의 요소 변경]
b[0] = 5
print(b)
# [5, 2, [3, 4]]
print(a)
# [1, 2, [3, 4]]
보면 b의 요소만 바뀌고 a는 그대로 이다.
두 개의 리스트 내의 [0]번째의 요소를 변경해준 거라서 지정된 리스트의 요소만 바뀐다.
[리스트 내의 리스트 요소를 변경]
import copy
a = [1, 2, [3, 4]]
b = copy.copy(a)
b[2].append(5)
print(b)
# [1, 2, [3, 4, 5]]
print(a)
# [1, 2, [3, 4, 5]]
a와 b 리스트 모두 5가 추가되었다.
리스트 내의 리스트는 하나의 리스트로 할당이 되었기 때문에 이걸 변경해주면 두 리스트 내의 리스트 요소는 같이 변경된다.
✳️ 깊은 복사(Deep copy)
깊은 복사는 가장 바깥 껍질부터 깊은 껍질까지도 복사를 해준다고 생각하면 된다.
import copy
a = [1, 2, [3, 4]]
b = copy.deepcopy(a)
b[2].append(5)
print(b)
# [1, 2, [3, 4, 5]]
print(a)
# [1, 2, [3, 4]]
copy 모듈을 써서 .deepcopy( ) 메소드를 이용했다.
얕은 복사랑 다르게 a 리스트 내의 리스트에는 5가 추가 되지 않았다.
그림으로 보면 이렇게 각각의 리스트에 또 각각의 리스트로 생성이 되면서 서로에게 영향을 주지 않기 때문에 b리스트만이 변경이 된 것이었다.
보통 immutable 객체를 복사하거나 변경을 한다면 에러 코드가 떠서 알아차릴 수 있지만,
mutable 객체는 그렇지 않기 때문에 조작 시에 나도 모르게 어딘가 바뀌어 버린 사태가 발생한다.
그래서 얕은 복사와 깊은 복사의 개념을 알고 적절히 잘 이용해야 한다고 한다.
'📒 Today I Learn > 🐍 Python' 카테고리의 다른 글
[Pandas] .drop_duplicates( ) : 데이터프레임 중복 제거 (0) | 2024.07.15 |
---|---|
[Pandas] .loc[ ] & .iloc[ ] (0) | 2024.07.15 |
[Python] While 문 (0) | 2024.07.09 |
[Python] range 함수 (0) | 2024.06.28 |
[Python 문법 기초] class, object, instance, self (0) | 2024.06.28 |