Python으로 사전 복사

  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()함수를 사용하는 것입니다.

튜토리얼이 마음에 드시나요? DelftStack을 구독하세요 YouTube에서 저희가 더 많은 고품질 비디오 가이드를 제작할 수 있도록 지원해주세요. 구독하다
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