[HSAT 6회 정기 코딩 인증평가 기출] 출퇴근길 문제를 풀다가
인자로 배열 100,000개를 100,000번 호출한 정답과
전역변수를 사용해서 효율적으로 처리한 정답이 거의 동일한 시간초가 나왔다.
100,000 X 100,000 = 4*100억 byte이다.
그렇다면 10Gbyte를 사용한 것인데 시간초과도 안 뜨고 왜 가장 큰 문제인 memory exceed도 나지 않았을까?
https://softeer.ai/practice/6248
Softeer - 현대자동차그룹 SW인재확보플랫폼
softeer.ai
해당 코드는 다음과 같다.
def dfs(now, adj, visit): # 목적지
if visit[now]==1:
return
else:
visit[now] = 1
for neigbor in adj[now]:
dfs(neigbor, adj, visit)
# 1) 출발지 -> 목적지
visited_st = [0]*(n+1)
visited_st[t] = 1
dfs(s, adj_list, visited_st)
인자로 n이 최대 10만 개인 배열을 최대 10만 번 호출한다.
함수를 호출하는 방법은 c에는 2가지가 있다.
1. Call by Value
메서드를 호출할 때 값을 넘겨줍니다.
이때 인자로 넘겨주는 것은 그 값을 깊은 복사를 해서 가져가기 때문에
함수에서 값을 바꿔도 복사된 값이 바뀌기 때문에 원본값은 변동이 없다.
1. Call by Reference
이와 달리 메서드를 호출할 때 데이터의 주소 값을 넘겨준다.
참조값을 보내기에 함수에서 값을 바꾸면 원본주소로 접근하여 원본값이 바뀐다.
그렇다면 파이썬에서 list객체를 인자로 넘기는 행위는 call by value로 넘긴 걸까?
정답은 틀렸다 땡!
결론을 먼저 말하면
Python은 Python만의 방식인 Call by assignment를 사용한다.
이것은 Mutable, Immutable객체에 따라서 호출방법을 정한다.
# 그렇다면 Mutable, Immutable객체란?
파이썬은 모든 변수를 객체로 정의하는데 이때 객체의 종류에 따라 Mutable, Immutable 객체로 나뉜다.
- Mutable(수정 가능한): list, dict, set
- Immutable(수정 불가능한): int, float, str, tuple
번외: str을 슬라이싱값을 추출해서 변화시키려고 하면 에러남(Immutable=불변의) 하기 때문이다.
name = "codewizard"
name[0] = "r"
와 같이 했다면
처럼 "문자열"객체는 바꿀 수 없다라고 나온다.
# 따라서 Call by assignment 는?
Mutable한 객체는 수정 가능하니 Call by reference형식으로 객체를 호출하며 함수에서 값을 수정하면 객체도 수정된다.
Immutable한 객체는 수정 불가능하니 Call by Value형식으로 객체를 호출하며 함수에서 값을 변경해도 객체가 바뀌지 않는다.
# 최종정리
- Python은 객체 종류에 따라 함수 호출방식이 다르다.
- Mutable 한 객체(list, dict, set)는 Call by reference로 호출
- Immutable 한 객체(int, str, tuple)는 Call by Value로 호출
'Programming > Python' 카테고리의 다른 글
[Python] Priority Queue, heapq의 차이점 (0) | 2024.01.14 |
---|---|
[Python] GIL과 thread-safe, Thread-Non-Safe (1) | 2024.01.11 |
[Python] class와 self (0) | 2023.10.20 |
[Python] +, append(), extend() 사용법과 내부로직 (0) | 2023.10.17 |