콘텐츠로 건너뛰기

Python의 참조 전달 방법과 사용법

CodeMDD.io

파이썬으로 참조에 의한 전달

참조에 의한 전달 정의하기

참조에 의한 전달에 대해 기술적인 세부 사항에 들어가기 전에, 이 용어를 구성요소별로 살펴보는 것이 도움이 됩니다:

  • “전달”이란 함수에 인자를 제공하는 것을 의미합니다.
  • ”참조에 의한”이란 함수에 전달하는 인자가 메모리에 이미 존재하는 변수에 대한 참조(reference)임을 의미합니다. 즉, 해당 변수의 독립적인 복사본이 아닌, 변수에 대한 참조를 함수에 제공하는 것입니다.

함수에 기존 변수에 대한 참조를 제공하기 때문에, 이 참조에서 수행하는 모든 작업은 해당 변수에 직접 영향을 미칩니다. 이것이 실제로 어떻게 작동하는지 몇 가지 예제를 살펴보겠습니다.

아래는 C#에서 참조에 의해 변수를 전달하는 방법을 보여주는 예입니다. 하이라이트된 줄에서 ref 키워드의 사용에 주목해주세요:

using System;
class Program
{
static void Main(string[] args)
{
int arg;
https://codemdd.io/ Passing by reference.
https://codemdd.io/ The value 42 is assigned to arg within the method.
Method1(ref arg);
https://codemdd.io/ Prints 42.
Console.WriteLine(arg);
https://codemdd.io/ Passing by value.
https://codemdd.io/ The value of arg is copied to anotherArg without affecting the original arg variable.
Method2(arg);
https://codemdd.io/ Prints 42 (the original value of arg).
Console.WriteLine(arg);
https://codemdd.io/ Output:
https://codemdd.io/ 42
https://codemdd.io/ 42
}
static void Method1(ref int param)
{
param = 42;
}
static void Method2(int param)
{
param = 0;
}
}

이 예에서 Method1ref 키워드를 사용하여 arg 변수에 대한 참조를 전달하고 42 값을 할당합니다. Method2arg의 값을 anotherArg에 복사하고 원래 arg 변수에 영향을 주지 않습니다.

파이썬에서의 인자 전달

파이썬에서 함수 인자는 독특한 방식으로 처리됩니다. 파이썬은 함수 인자를 “참조 전달(reference passing)“이나 “값 전달(value passing)“이라는 분명한 용어로 특정하지 않습니다. 대신 인자의 동작은 변수의 타입과 인자에 대한 할당 방식에 따라 다릅니다.

파이썬에서 인자 할당은 객체의 참조를 의미합니다. 인자로 전달된 객체의 변경 사항은 해당 참조를 통해 직접 반영됩니다. 따라서 객체의 변경이 가능한지 여부에 따라 인자가 참조에 의해 전달되는지 여부가 결정됩니다.

파이썬에서는 변경 가능한(mutable) 객체인 리스트(lists)와 딕셔너리(dictionaries)를 사용하여 참조에 의한 전달을 구현할 수 있습니다. 이러한 객체는 값이 변경 가능하므로 인자로 전달할 때 객체 자체의 변경도 가능합니다.

반면에 변경 불가능한(immutable) 객체인 숫자(numbers), 문자열(strings) 및 튜플(tuples)은 참조에 의한 전달을 구현할 수 없습니다. 변경 불가능한 객체에 대한 모든 작업은 새로운 객체를 생성하므로 기존 참조는 영향을 받지 않습니다.

def method1(obj):
obj.append(42)
my_list = []
method1(my_list)
print(my_list)
# 출력: [42]

위 예제에서는 method1my_list라는 리스트 객체를 전달합니다. method1에서는 append 메서드를 사용하여 리스트에 42를 추가합니다. 이 작업은 원래의 리스트 객체에 영향을 미치므로 print 함수의 결과로 [42]가 출력됩니다.

이제 숫자와 문자열에 대해 같은 작업을 수행해 봅시다:

def method2(obj):
obj += " World"
my_str = "Hello"
method2(my_str)
print(my_str)
# 출력: Hello

위 예제에서는 method2my_str이라는 문자열 객체를 전달합니다. method2에서는 += 연산자를 사용하여 문자열에 ” World”를 추가합니다. 하지만 변경 불가능한 문자열은 이 작업을 수행할 수 없으므로 기존 객체에 영향을 미치지 않습니다. 따라서 print 함수의 결과로 Hello가 출력됩니다.

파이썬에서 참조에 의한 전달 복제하기

파이썬에서 pass by reference를 직접적으로 복제하는 방법은 없지만 몇 가지 관례적인 방법을 사용하여 비슷한 동작을 구현할 수 있습니다. 다음은 참조에 의한 전달을 복제하는 몇 가지 가장 좋은 방법입니다.

최선의 방법: 반환하고 다시 할당하기

def method3(obj):
obj.append(42)
return obj
my_list = []
my_list = method3(my_list)
print(my_list)
# 출력: [42]

method3에서는 객체에 변경 사항을 적용한 후, 변경된 객체를 반환하고 다시 할당합니다. 이렇게 하면 변경된 객체를 기존 참조에 다시 할당하므로 변경된 값이 유지됩니다.

최선의 방법: 객체 속성 사용하기

class MyClass:
def __init__(self, value):
self.value = value
def method4(obj):
obj.value += 1
my_obj = MyClass(42)
method4(my_obj)
print(my_obj.value)
# 출력: 43

위 예제에서는 method4MyClass 인스턴스인 my_obj를 전달합니다. method4에서는 value 속성의 값을 증가시킵니다. 이 작업은 원래의 객체에 영향을 미치므로 print 함수의 결과로 43이 출력됩니다.

최선의 방법: 딕셔너리와 리스트 사용하기

def method5(obj):
obj['key'] += 1
my_dict = {'key': 42}
method5(my_dict)
print(my_dict['key'])
# 출력: 43

위 예에서는 method5에 딕셔너리 객체인 my_dict를 전달합니다. method5에서는 key 키의 값을 증가시킵니다. 이 작업은 기존의 딕셔너리 객체에 영향을 미치므로 print 함수의 결과로 43이 출력됩니다.

결론

파이썬에서 함수 인자 동작은 참조에 의한 전달의 강력한 기능을 대체하여 구현됩니다. 변경 가능한 객체를 사용하여 참조에 의한 전달을 흉내내거나 반환하고 다시 할당하거나 객체 속성을 사용하거나 딕셔너리와 리스트를 사용할 수 있습니다.

전달하는 객체의 변경 여부에 따라 적절한 방법을 선택하고 코드에서 명확한 의도를 나타내기 위해 주석을 사용하는 것이 중요합니다. 이를 통해 함수 인자의 동작을 명확하게 이해하고 예상할 수 있습니다.


이 튜토리얼에서는 파이썬에서 인자 전달에 대한 동작을 이해하기 위해 파이썬의 독특한 방식으로 함수 인자를 처리하는 방법을 알아보았습니다. 참조에 의한 전달을 구현하기 위해 일부 변경 가능한 객체를 사용하는 방법과 몇 가지 가장 좋은 방법을 소개했습니다. 이를 통해 함수 인자에 대한 함정을 피하고 설명된 작동을 실행 가능한 단계별 샘플 코드와 함께 제공했습니다. 파이썬을 사용하여 효과적인 함수 인자 전달을 구현하는 데 도움이 되길 바랍니다.