기타/python

Python에서 함수 인자로 변수를 넘기는 방식

남하욱 2025. 1. 19. 17:55

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