Python으로 사전 복사

Rayven Esplanada 2023년1월30일
  1. Python에서 사전 복사 : 참조로 전달
  2. Python에서 사전 복사 : 값으로 전달
  3. Python 사전의 얕은 사본
Python으로 사전 복사

이 자습서에서는 Python의 사전을 복사하는 방법에 대해 설명합니다.

우리는 값으로 전달하는 것과 참조로 전달하는 두 가지 방법으로 사전을 복사하는 방법을 보여줄 것입니다.

Python에서 사전 복사 : 참조로 전달

Python에서 객체는 암시 적으로 복사되지 않습니다. food를 새 변수 meal에 복사하려고하면 food의 값이 meal에 복사되지만 food에 대한 참조도 복사됩니다.

meal = food

한 개체를 다른 개체와 직접 동일시하면 새 개체가 이전 개체를 가리 킵니다. 이것은 두 변수가 동일한 고유 개체를 참조한다는 것을 의미합니다.

mealFruit값을 Banana로 업데이트하면 foodFruit값도 대체됩니다.

meal["Fruit"] = "Banana"
print(food)
print(meal)

출력:

{'Fruit': 'Banana', 'Vegetable': 'Lettuce', 'Poultry': 'Chicken', 'Fish': 'Cod'}
{'Fruit': 'Banana', 'Vegetable': 'Lettuce', 'Poultry': 'Chicken', 'Fish': 'Cod'}

meal블록에서 키를 업데이트하려고해도 마찬가지입니다. Fruit키를 Circle Fruit로 바꾸고 사전에서 꺼내기 전에 해당 값을 복사합니다.

meal["Circle Fruit"] = meal.pop("Fruit")
print(food)
print(meal)

출력:

{'Vegetable': 'Lettuce', 'Poultry': 'Chicken', 'Fish': 'Cod', 'Circle Fruit': 'Orange'}
{'Vegetable': 'Lettuce', 'Poultry': 'Chicken', 'Fish': 'Cod', 'Circle Fruit': 'Orange'}

food의 값은 우리가 직접 수정하지 않았더라도 여전히 대체됩니다. ‘음식’을 meal로 복사하는 데 사용한 방법이 참조로 전달되기 때문입니다.

Python 복사 사전-참조로 전달

Python에서 사전 복사 : 값으로 전달

값으로 전달한다는 것은 개체를 복사 할 때 원본 개체를 가리키는 대신 개체의 실제 복사본이 메모리에 생성된다는 것을 의미합니다.

사전을 복사하고 원래 값을 참조하지 않으려면 메모리에서 새 개체를 인스턴스화하는 방법을 찾아야합니다. 파이썬에는이 접근 방식을 지원하는 몇 가지 함수가 있습니다 :dict(),copy(),deepcopy().

dict()함수는 새 사전 객체를 인스턴스화합니다. 이 함수를 기존 사전을 감싸면 객체의 새 인스턴스가 생성됩니다.

이 방법에서는 food사전의 동일한 예를 사용합니다.

meal = dict(food)

값으로 전달하는 또 다른 방법은copy()명령을 사용하는 것입니다.dict()와 동일한 작업을 수행합니다. 메모리에 새 객체를 인스턴스화합니다. 차이점은copy()는 사전을 포함한 콜렉션 객체의 내장 함수라는 것입니다.

meal = food.copy()

두 시나리오 모두에서Fruit 값을 수정하고Vegetable 키를 교체해 보겠습니다.

meal["Fruit"] = "Apple"
meal["Greens"] = meal.pop("Vegetable")
print(food)
print(meal)

출력:

{'Fruit': 'Orange', 'Vegetable': 'Lettuce', 'Poultry': 'Chicken', 'Fish': 'Cod'} # food (original)
{'Fruit': 'Apple', 'Poultry': 'Chicken', 'Fish': 'Cod', 'Greens': 'Lettuce'} # meal (copy)

dict()또는copy()를 사용하여 새 객체meal을 인스턴스화하면 원래 객체를 참조하고meal이 업데이트 된 경우 해당 값을 업데이트하지 않습니다.

Python 사전의 얕은 사본

dict()copy()의 문제점은 사용중인 객체에 얕은 복사 만 적용한다는 것입니다. 사전에 복잡한 중첩 구조가있는 경우 문제가됩니다.

얕은 복사는 중첩 된 개체가 새 공간을 차지하기 때문에 보이는 메모리의 첫 번째 레이어 만 복사합니다.

파이썬 복사 사전-얕은 복사

원래 객체를 중첩 된 사전으로 변경해 보겠습니다.

info = {
    "Numbers": [1, 2, 3],
    "Resident Name": "Sherlock",
    "Address": {"Street": "Baker", "Number": "221B", "City": "Miami"},
}

copy()dict()를 사용하여info에서 복사하고 중첩 된 사전의 일부 값을 변경하여 새 객체info2를 선언 해 보겠습니다.

info2 = info.copy()  # or dict(info)
info2["Numbers"][1] = 4
info2["Resident Name"] = "Holmes"
info2["Address"]["City"] = "Lexington"
print(info)
print(info2)

출력:

{'Numbers': [1, 4, 3], 'Resident Name': 'Sherlock', 'Address': {'Street': 'Baker', 'Number': '221B', 'City': 'Lexington'}}
{'Numbers': [1, 4, 3], 'Resident Name': 'Holmes', 'Address': {'Street': 'Baker', 'Number': '221B', 'City': 'Lexington'}}

NumbersAddress.City의 새 값이 원본 및 사본 버전 모두에서 업데이트됩니다. Resident Name 값은 객체에 대해 단순 복사 만 수행했기 때문에info2 블록 만 업데이트했습니다.

Python에서copy 모듈을 사용한 전체 복사

전체 복사는 기본적으로 얕은 복사 문제를 해결합니다. 객체를 복사 할 때 중첩 된 객체를 확인하고 메모리에 새 객체를 재귀 적으로 생성합니다.

Python에서는 얕은 및 전체 복사 작업과 유틸리티를 포함하는 모듈 copy을 사용하여 전체 복사를 수행 할 수 있습니다.

import copy

모듈의deepcopy()함수를 사용하여 사전에 중첩 된 객체를 깊게 복사합니다. 위와 동일한 예제info 블록을 사용합니다.

info2 = copy.deepcopy(info)
info2["Numbers"][1] = 4
info2["Resident Name"] = "Holmes"
info2["Address"]["City"] = "Lexington"
print(info)
print(info2)

출력:

{'Numbers': [1, 2, 3], 'Resident Name': 'Sherlock', 'Address': {'Street': 'Baker', 'Number': '221B', 'City': 'Miami'}}
{'Numbers': [1, 4, 3], 'Resident Name': 'Holmes', 'Address': {'Street': 'Baker', 'Number': '221B', 'City': 'Lexington'}}

이제 원래 사전info는 중첩 된 객체를 포함하여info2의 여러 변경 사항이 있어도 변경되지 않습니다.

요약하면 Python에서 사전을 복사하는 방법은 여러 가지가 있지만 출력이 모두 동일하지는 않습니다. =로 사전을 직접 할당하면 원본 객체를 가리키는 참조로 전달됩니다.

dict()copy()와 같은 얕은 복사 함수는 중첩되지 않은 사전에 대해서만이 문제를 해결합니다.
중첩 된 사전을 고려하여 사전을 복사하는 가장 좋은 방법은copy 모듈에서 제공하는deepcopy()함수를 사용하는 것입니다.

Rayven Esplanada avatar Rayven Esplanada avatar

Skilled in Python, Java, Spring Boot, AngularJS, and Agile Methodologies. Strong engineering professional with a passion for development and always seeking opportunities for personal and career growth. A Technical Writer writing about comprehensive how-to articles, environment set-ups, and technical walkthroughs. Specializes in writing Python, Java, Spring, and SQL articles.

LinkedIn

관련 문장 - Python Dictionary