반응형
  1. 객체 잠조 복사(pass-by-object-reference)
  2. 값 복사
  3. 레퍼런스 복사

객체 참조 복사

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에도 변경 사항이 반영되었습니다. 두 변수 모두 메모리에서 동일한 객체를 참조하기 때문입니다.

참조 복사는 새 개체를 만들고 값을 복사할 필요가 없기 때문에 특히 큰 개체로 작업할 때 값 복사보다 더 효율적일 수 있습니다. 그러나 하나의 참조를 통해 개체에 대한 변경 사항이 동일한 개체에 대한 다른 모든 참조에 영향을 미치므로 의도하지 않은 부작용이 발생할 수도 있습니다. 이러한 부작용을 방지하기 위해 개체의 전체 복사본을 만들 수 있습니다. 그러면 원래 개체 값의 복사본과 모든 중첩된 개체를 사용하여 새 개체가 생성됩니다.

반응형