- 객체 잠조 복사(pass-by-object-reference)
- 값 복사
- 레퍼런스 복사
객체 참조 복사
Python에서 함수에 값을 복사할 때 실제로 개체 자체의 복사본이 아니라 개체에 대한 참조를 복사합니다. 이 개념을 "객체 참조 복사" 또는 "참조 값 복사"이라고 합니다. 함수에서 값 복사 동작은 객체가 변경 가능한지 또는 변경 불가능한지에 따라 다릅니다.
1. 불변 객체(Immutable Objects)
숫자, 문자열 및 튜플과 같은 불변 객체의 경우 함수 내 객체에 대한 모든 변경 사항은 새 객체를 생성합니다. 원래 개체는 변경되지 않은 상태로 유지되므로 개체의 복사본이 함수에 복사된 것처럼 보입니다.
def modify_value(x):
x = x + 1
print(f"Inside the function: {x}")
number = 5
modify_value(number)
print(f"Outside the function: {number}")
Output
Inside the function: 6
Outside the function: 5
이 예에서 변수 number는 함수 내에서 수정되더라도 함수 외부에서는 변경되지 않은 상태로 유지됩니다.
2. 가변 객체(Mutable Object)
리스트, 딕셔너리 및 집합과 같은 변경 가능한 개체의 경우 참조가 동일한 개체를 가리키기 때문에 함수 내에서 개체에 대한 변경 사항이 함수 외부에도 반영됩니다.
def modify_list(lst):
lst.append(4)
print(f"Inside the function: {lst}")
my_list = [1, 2, 3]
modify_list(my_list)
print(f"Outside the function: {my_list}")
Output
Inside the function: [1, 2, 3, 4]
Outside the function: [1, 2, 3, 4]
이 예제에서 함수 내 리스트에 대한 변경 사항은 함수 외부에서도 볼 수 있습니다.
변경 가능한 객체를 함수에 복사하기 전에 복사본을 만들고 싶다면 얕은 복사본에는 copy 모듈을, 깊은 복사본에는 deepcopy 모듈을 사용할 수 있습니다. 이렇게 하면 함수가 복사본을 수정할 때 원본 객체가 변경되지 않은 상태로 유지됩니다.
값 복사
"값 복사"이라고도 하는 값 복사는 원래 개체 값의 복사본을 사용하여 새 개체를 만드는 프로세스입니다. 이 경우 원본 객체와 복사된 객체는 서로 독립적입니다. 한 개체를 수정해도 다른 개체에는 영향을 미치지 않습니다. 이는 두 객체가 별개의 메모리 위치를 가지고 있고 해당 값이 분리되어 있기 때문입니다.
Python에서 정수, 실수, 문자열 및 튜플과 같은 불변 유형은 값 복사를 사용합니다. 불변 객체의 값을 다른 변수에 할당하면 새 객체가 생성되고 원래 객체에서 값이 복사됩니다.
다음은 값 복사를 설명하는 예입니다.
original_string = "hello"
copied_string = original_string
original_string = "world"
print(original_string) # Output: world
print(copied_string) # Output: hello
예제에서는 original_string 값을 copied_string에 할당했습니다. 나중에 original_string을 수정했을 때 copied_string에는 영향을 미치지 않았습니다. 두 변수가 독립적이고 별도의 메모리 위치에 값을 저장하기 때문입니다.
값 복사는 함수에 인수로 복사하거나 복사본을 만들 때 원래 개체가 변경되지 않은 상태로 유지되도록 합니다. 그러나 값 복사는 큰 개체를 처리할 때 효율성이 떨어질 수 있습니다. 동일한 값으로 새 개체를 만들면 상당한 양의 메모리와 처리 시간이 소비될 수 있기 때문입니다. 이러한 경우 참조 복사가 더 효율적일 수 있습니다.
레퍼런스 복사
"참조에 의한 복사"이라고도 하는 참조 복사는 개체 값의 별도 복사본을 만드는 대신 기존 개체에 대한 새 참조(또는 별칭)를 만드는 프로세스입니다. 이는 원본 참조와 복사된 참조가 모두 메모리의 동일한 개체를 가리키며 한 참조를 통해 개체에 대한 모든 변경 사항이 다른 참조에 반영됨을 의미합니다.
Python에서 목록, 사전 및 집합과 같은 변경 가능한 유형은 참조 복사를 사용합니다. 변경 가능한 개체를 다른 변수에 할당하면 새 개체가 생성되지 않습니다. 대신 두 변수 모두 동일한 개체를 참조합니다.
다음은 참조 복사를 설명하는 예입니다.
original_list = [1, 2, 3]
copied_list = original_list
original_list[0] = 99
print(original_list) # Output: [99, 2, 3]
print(copied_list) # Output: [99, 2, 3]
예제에서는 original_list의 참조를 copied_list에 할당했습니다. 나중에 original_list를 수정했을 때 copied_list에도 변경 사항이 반영되었습니다. 두 변수 모두 메모리에서 동일한 객체를 참조하기 때문입니다.
참조 복사는 새 개체를 만들고 값을 복사할 필요가 없기 때문에 특히 큰 개체로 작업할 때 값 복사보다 더 효율적일 수 있습니다. 그러나 하나의 참조를 통해 개체에 대한 변경 사항이 동일한 개체에 대한 다른 모든 참조에 영향을 미치므로 의도하지 않은 부작용이 발생할 수도 있습니다. 이러한 부작용을 방지하기 위해 개체의 전체 복사본을 만들 수 있습니다. 그러면 원래 개체 값의 복사본과 모든 중첩된 개체를 사용하여 새 개체가 생성됩니다.
'Python > Python 기본' 카테고리의 다른 글
[Python] 다양한 오류와 해결 방안 (2) (0) | 2023.05.02 |
---|---|
[Python] 다양한 오류와 해결 방안 (1) (0) | 2023.05.02 |
[Python] 스택(stack)과 힙(heap) (0) | 2023.04.30 |
[Python] key 매개 변수, 콜백 함수 (0) | 2023.04.30 |
[Python] 반복문을 사용하는 여러가지 방법 (0) | 2023.04.30 |