먼저 python list의 메모리 관리 방식에 대한 이해가 필요하다.
python에서 연산자 중에 '=='는 값을 비교하는 연산자이고, 'is'는 메모리의 주소를 비교하는 연산이다.
아래 코드를 보자.
a=300
b=300
a is b #False
a == b #True
그런데 조금 다른 결과가 나타나는 경우가 있는데,
a = 1
b = 1
a is b #True
a == b #True
엥? 이 때는 a와 b의 메모리 주소가 같은 걸까?? 이것은 파이썬의 정수형 저장 방식의 특성 때문인데, -5부터 256까지의 정수값은 특정 메모리 주소에 저장한 후 해당 숫자를 할당하려고 하면 해당 변수는 그 숫자가 가진 메모리 주소로 연결한다.
리스트가 위와 같은 메모리 저장 방식을 택하고 있다고 생각하면 되는데,
파이썬은 리스트를 저장할 때 값 자체가 아니라 값이 위치한 메모리 주소(reference)를 저장한다.
그래서 다음 코드처럼 리스트 안에는 문자열과 숫자가 혼용되어 쓰일 수 있고,
리스트 b전체를 아예 리스트 a로 할당해버릴 수 있다.
a=[5,4,3,2,1]
b=['항공대','전영서',3]
b=a
print(a) #[5,4,3,2,1]
위에서 본 코드와 연결해서 이번에는 sort 함수를 적용해보자. 분명 밑에 코드에서는 a를 sort시켰지만 b를 출력시켰더니 b가 sort되어 출력됨을 볼 수 있다.
a.sort()
print(b)
#[1,2,3,4,5]
이렇게 메모리 주소가 같아 생기는 해프닝을 방지하기 위해서는
sorted(a)로 정렬된 새로운 리스트를 리턴시켜 주자.
'알고리즘 > 이론' 카테고리의 다른 글
[PS|DP] 부분배열과 부분집합의 구현 (0) | 2023.06.15 |
---|---|
[PS] 분할정복 (0) | 2022.08.13 |
[PS] binary search 정리 (0) | 2022.08.12 |
[PS] 파이썬 함수 호출 방식에서의 주의점(참조, 값에 의한) (0) | 2022.06.11 |