파이썬 자료구조/알고리즘 08 : 객체에 따른 인수, 매개변수의 교환 방식

728x90

객체에 따른 인수, 매개변수의 교환 방식


인자, 인수, 매개변수의 차이

def sumsum(n):    # n = 인자/매개변수/parameter
    s = 0
    while n > 0:
        s += n
        n -= 1
    return s

x = int(input())
print(f'1부터 {x}까지 정수의 합 : {sumsum(x)}')		# x = 인수/argument

 

파이썬에서 인수와 매개변수의 교환 방식 (이뮤터블의 경우)

 

Immutable : 변경 불가능한 객체

String, tuple, 숫자 등

def sumsum(n):
    s = 0
    while n > 0:
        s += n
        n -= 1
    return s

x = int(input())
print(f'1부터 {x}까지 정수의 합 : {sumsum(x)}')
>> 5
1부터 5까지 정수의 합 : 15

 

위는 1부터 입력받은 숫자 x까지의 정수의 합을 반환하는 함수이다.

출력 결과를 보면 sumsum 함수로 넘겨주는 인수 x값은 함수가 종료되어도 호출하기 전 그대로의 값을 유지하고 있음을 알 수 있다.

 

int는 이뮤터블 타입이기 때문에 인수 x의 값은 변하지 않는다.

매개변수 n은 함수 시작 지점에서 인수 x의 값을 참조하고 있다가 함수 안에서 n의 값이 변경되면 다른 객체를 생성하고 그 객체에 대한 참조로 업데이트된다. 따라서 매개변수의 값은 실제 인수의 값에 영향을 주지 않는다.

 

파이썬 공식문서에서는 이러한 참조 방식을 객체 참조에 의한 전달(Call by object reference)이라고 설명한다.

 

다른 프로그래밍 언어에서는 실제 인수의 값을 매개변수에 복사하는 방식을 사용하고

이를 값에 의한 호출(Call by value)이라고 부른다. 마찬가지로 전달받은 매개변수에 변화가 있어도 실제 인수 값에는 영향을 미치지 않는다.

 

 


파이썬에서 인수와 매개변수의 교환 방식 (뮤터블의 경우)

Mutable : 변경 가능한 객체

List, set, dictionary 등

 

def change(new_lst, idx, val):
    new_lst[idx] = val

lst = [11, 22, 33, 44, 55]
print('lst =', lst)

index = int(input('업데이트할 인덱스 번호 : '))
value = int(input('새로운 값 : '))

change(lst, index, value)
print(f'lst = {lst}')
lst = [11, 22, 33, 44, 55]
>> 업데이트할 인덱스 번호 : 3
>> 새로운 값 : 88
lst = [11, 22, 33, 88, 55]

 

인수가 리스트와 같은 뮤터블 타입인 경우는 매개변수가 인수 값에 영향을 주게 된다.

 

change() 함수는 기존 리스트에 대해서 입력받은 인덱스 번호와 값으로 변경하는 역할을 수행한다.

int와 같은 이뮤터블 한 인수와 달리 뮤터블 한 리스트는 인수값으로 넘겨주었던 lst의 값이 함수가 종료된 후에도 변경되어있음을 확인할 수 있다.

 

이와 같은 방식은 변수의 값을 변경하면 객체 자체를 업데이트하는 참조에 의한 호출이다.(Call by reference)

728x90