python에서 함수의 인자로 변수를 넘겨줄 때, 이 인자는 원본 변수가 참조하는 객체(object)의 참조(reference)를 받는다.
즉, 인자로 넘겨준 변수와 함수에서 사용하는 변수는 같은 객체를 사용한다.
함수에서 인자로 배열을 넘길 때, 함수의 매개 변수로 복사가 일어나는 것이 아니라, 이 매개 변수가 원본 변수와 같은 주소의 객체를 참조할 수 있도록 메모리 주소를 넘겨줌.
객체(object)
데이터가 실제로 저정된 메모리 block
참조(reference)
- 객체의 메모리 주소를 가리키는 것.
- 포인터와 유사한 개념
- 모든 변수는 이 객체의 메모리 주소를 저장하여 이 객체 block을 가리킴.
- 즉, 변수는 객체 자체를 저장하는 것이 아니라, 객체에 대한 참조를 저장해서 객체에 접근함
예제 및 정리
같은 객체를 참조하고 있기 때문에, 함수 내에서 이 값을 변경하면 원본 값도 변경이 일어남
# 배열의 첫 번째 값을 변경
def modify_array(arr):
arr[0] = 99
original = [1, 2, 3]
modify_array(original)
print(original) # [99, 2, 3]
함수 내에서 매개 변수에 새로운 객체를 할당하면 참조 관계가 끊김.
만약 함수 내에서 원본 배열을 보호하고 싶다면, 함수 내에서 새로 할당을 하거나, 배열을 깊은 복사하여서 사용하면 됨
def reassign_array(arr):
arr = [4, 5, 6] # 새로운 배열을 할당
arr[0] = 99
original = [1, 2, 3]
reassign_array(original)
print(original) # [1, 2, 3], 바뀌지 않음
불변 객체(int, str 등)는 함수 내부에서 값을 변경하면 새로운 객체가 생성됨. (원본 값은 영향을 받지 않음)
def modify_integer(num):
num += 10 # 새로운 int 객체 생성
original = 5
modify_integer(original)
print(original) # 5, 바뀌지 않음
복사를 하는 것이 아니기 때문에, 큰 배열과 같은 값을 인자로 넘길 때 메모리 복사로 인한 속도 저하가 발생하지 않음
import time
# 큰 배열을 전달하는 함수
def process_large_array(arr):
arr[0] += 1 # 배열의 첫 번째 값을 수정
return arr
# 큰 배열 생성
large_array = [0] * 10**7 # 천만 개의 0으로 이루어진 배열
# 함수 호출 전후로 시간 측정
start_time = time.time()
processed_array = process_large_array(large_array)
end_time = time.time()
# 결과 출력
print("실행 시간:", end_time - start_time, "초") # 매우 작은 값, 거의 시간이 소요되지 않음
'기타 > python' 카테고리의 다른 글
Segmented Reduction이란 (0) | 2025.02.08 |
---|