본문 바로가기

언어/Python

[ Python ] 리스트를 인수로 전단 후 사용하기

반응형

파이썬에서 리스트를 함수의 인수로 넘길 때, 리스트 자체가 함수 외부와 내부에서 동일한 객체로 취급됩니다.
이는 파이썬의 객체 참조 방식 때문입니다.
파이썬에서 리스트와 같은 가변 객체(mutable object)는 함수에 전달될 때, 객체의 참조가 전달됩니다.
따라서 함수 내에서 리스트를 수정하면 함수 외부의 리스트에도 영향을 미칩니다.

1. 개념 설명

1.1 객체 참조

  • 가변 객체: 리스트, 딕셔너리, 세트 등은 가변 객체로, 객체 내부의 값을 변경할 수 있습니다.
  • 불변 객체: 정수, 문자열, 튜플 등은 불변 객체로, 객체 자체는 변경할 수 없습니다.

파이썬에서 함수 인수는 값에 의한 호출(call by value) 방식이 아니라, 참조에 의한 호출(call by reference) 방식으로 전달됩니다. 이는 함수에 전달된 인수가 실제 객체를 참조한다는 의미입니다.

2. 예제 코드

아래 예제를 통해 리스트를 함수 인수로 넘기고 함수 내부에서 값을 변경할 때 함수 외부의 데이터가 어떻게 영향을 받는지 설명합니다.

2.1 예제 1: 리스트를 함수 인수로 전달

def modify_list(lst):
    lst.append(4)
    print("함수 내부에서의 리스트:", lst)

# 리스트 생성
my_list = [1, 2, 3]

# 함수 호출
modify_list(my_list)

# 함수 호출 후 리스트 출력
print("함수 외부에서의 리스트:", my_list)

출력:

함수 내부에서의 리스트: [1, 2, 3, 4]
함수 외부에서의 리스트: [1, 2, 3, 4]

위 예제에서 modify_list 함수는 리스트를 인수로 받아서 마지막에 4를 추가합니다. 함수 내부에서 리스트를 수정했기 때문에, 함수 외부의 리스트 my_list도 변경됩니다.

2.2 예제 2: 리스트의 특정 요소 변경

def modify_element(lst):
    lst[0] = 100
    print("함수 내부에서의 리스트:", lst)

# 리스트 생성
my_list = [1, 2, 3]

# 함수 호출
modify_element(my_list)

# 함수 호출 후 리스트 출력
print("함수 외부에서의 리스트:", my_list)

출력:

함수 내부에서의 리스트: [100, 2, 3]
함수 외부에서의 리스트: [100, 2, 3]

이 예제에서는 리스트의 첫 번째 요소를 100으로 변경합니다. 이 역시 함수 외부의 리스트에 영향을 미칩니다.

3. 주의사항

함수 내부에서 새로운 리스트를 생성하고 그것을 반환하지 않는 한, 원래의 리스트는 수정됩니다. 만약 함수 내부에서 원래 리스트를 변경하지 않고, 새 리스트를 생성하고자 한다면, 리스트의 얕은 복사(shallow copy)나 깊은 복사(deep copy)를 사용할 수 있습니다.

3.1 얕은 복사

def modify_list_copy(lst):
    lst_copy = lst[:]
    lst_copy.append(4)
    print("함수 내부에서의 리스트:", lst_copy)

# 리스트 생성
my_list = [1, 2, 3]

# 함수 호출
modify_list_copy(my_list)

# 함수 호출 후 리스트 출력
print("함수 외부에서의 리스트:", my_list)

출력:

함수 내부에서의 리스트: [1, 2, 3, 4]
함수 외부에서의 리스트: [1, 2, 3]

얕은 복사는 슬라이싱([:])을 사용하여 원래 리스트의 복사본을 생성합니다. 함수 내부에서 복사본을 수정하므로 원래 리스트는 변경되지 않습니다.

3.2 깊은 복사

깊은 복사는 리스트 안에 리스트가 있는 경우, 모든 중첩된 리스트까지 복사합니다. 이를 위해 copy 모듈의 deepcopy 함수를 사용할 수 있습니다.

import copy

def modify_list_deepcopy(lst):
    lst_copy = copy.deepcopy(lst)
    lst_copy[0][0] = 100
    print("함수 내부에서의 리스트:", lst_copy)

# 리스트 생성
my_list = [[1, 2], [3, 4]]

# 함수 호출
modify_list_deepcopy(my_list)

# 함수 호출 후 리스트 출력
print("함수 외부에서의 리스트:", my_list)

출력:

함수 내부에서의 리스트: [[100, 2], [3, 4]]
함수 외부에서의 리스트: [[1, 2], [3, 4]]

deepcopy를 사용하면 리스트 내부의 중첩된 리스트까지 복사하여, 원본 리스트를 안전하게 보호할 수 있습니다.

4. 요약

파이썬에서 리스트를 함수 인수로 넘기면, 함수 내부에서 리스트를 수정할 경우 함수 외부의 리스트도 영향을 받습니다.
이는 파이썬이 가변 객체를 참조에 의해 전달하기 때문입니다.
원래 리스트를 변경하지 않으려면 얕은 복사나 깊은 복사를 사용하여 복사본을 생성하고, 이를 수정하는 방법을 사용할 수 있습니다.

반응형