Python으로 사전 복사
이 자습서에서는 Python의 사전을 복사하는 방법에 대해 설명합니다.
우리는 값으로 전달하는 것과 참조로 전달하는 두 가지 방법으로 사전을 복사하는 방법을 보여줄 것입니다.
Python에서 사전 복사 : 참조로 전달
Python에서 객체는 암시 적으로 복사되지 않습니다. food
를 새 변수 meal
에 복사하려고하면 food
의 값이 meal
에 복사되지만 food
에 대한 참조도 복사됩니다.
meal = food
한 개체를 다른 개체와 직접 동일시하면 새 개체가 이전 개체를 가리 킵니다. 이것은 두 변수가 동일한 고유 개체를 참조한다는 것을 의미합니다.
meal
의 Fruit
값을 Banana
로 업데이트하면 food
의 Fruit
값도 대체됩니다.
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에서 사전 복사 : 값으로 전달
값으로 전달한다는 것은 개체를 복사 할 때 원본 개체를 가리키는 대신 개체의 실제 복사본이 메모리에 생성된다는 것을 의미합니다.
사전을 복사하고 원래 값을 참조하지 않으려면 메모리에서 새 개체를 인스턴스화하는 방법을 찾아야합니다. 파이썬에는이 접근 방식을 지원하는 몇 가지 함수가 있습니다 :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'}}
Numbers
및Address.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()
함수를 사용하는 것입니다.
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