python에서 받아쓰기의 깊은 사본
a의 깊은 카피를 만들고 싶다.dict
비단뱀으로불행히도.deepcopy()
에 대한 방법이 존재하지 않는다.dict
어떻게 하지?
>>> my_dict = {'a': [1, 2, 3], 'b': [4, 5, 6]}
>>> my_copy = my_dict.deepcopy()
Traceback (most recent calll last):
File "<stdin>", line 1, in <module>
AttributeError: 'dict' object has no attribute 'deepcopy'
>>> my_copy = my_dict.copy()
>>> my_dict['a'][2] = 7
>>> my_copy['a'][2]
7
마지막 줄은3
.
나는 그 수정을 하고 싶다.my_dict
스냅샷에 영향을 주지 않음my_copy
.
그걸 어떻게 하는 거죠?이 솔루션은 Python 3.x와 호환되어야 한다.
다음을 참조하십시오.
import copy
d = { ... }
d2 = copy.deepcopy(d)
Python 2 또는 3:
Python 3.2 (r32:88445, Feb 20 2011, 21:30:00) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import copy
>>> my_dict = {'a': [1, 2, 3], 'b': [4, 5, 6]}
>>> my_copy = copy.deepcopy(my_dict)
>>> my_dict['a'][2] = 7
>>> my_copy['a'][2]
3
>>>
dict.copycopy는 사전의 얕은 복사함수다.
id는 변수의 주소를 제공하는 내장 함수임
먼저 "왜 이 특별한 문제가 발생하는가?"를 이해할 필요가 있다.
In [1]: my_dict = {'a': [1, 2, 3], 'b': [4, 5, 6]}
In [2]: my_copy = my_dict.copy()
In [3]: id(my_dict)
Out[3]: 140190444167808
In [4]: id(my_copy)
Out[4]: 140190444170328
In [5]: id(my_copy['a'])
Out[5]: 140190444024104
In [6]: id(my_dict['a'])
Out[6]: 140190444024104
두 키 'a'에 대한 받아쓰기에 존재하는 리스트의 주소가 동일한 위치를 가리키고 있다.
따라서 my_dict에서 목록 값을 변경하면 my_copy의 목록도 변경된다.
질문에 언급된 데이터 구조를 위한 솔루션:
In [7]: my_copy = {key: value[:] for key, value in my_dict.items()}
In [8]: id(my_copy['a'])
Out[8]: 140190444024176
또는 위에서 언급한 대로 딥카피를 사용할 수도 있다.
파이톤 3.x
from copy import deepcopy
my_dict = {'one': 1, 'two': 2}
new_dict_deepcopy = deepcopy(my_dict)
딥카피가 없으면 도메인 사전 내에서 호스트 이름 사전을 제거할 수 없다.
딥카피 없이 다음과 같은 오류가 발생한다.
"RuntimeError: dictionary changed size during iteration"
...다른 사전의 안쪽에 있는 내 사전에서 원하는 요소를 제거하려고 할 때.
import socket
import xml.etree.ElementTree as ET
from copy import deepcopy
도메인은 사전 객체다.
def remove_hostname(domain, hostname):
domain_copy = deepcopy(domain)
for domains, hosts in domain_copy.items():
for host, port in hosts.items():
if host == hostname:
del domain[domains][host]
return domain
예제 출력: [orginal]도메인 = {'localdomain': {'localhost': {'all': '4000'}}
[new]message = {'localdomain': {} }}
그래서 여기서 일어나는 일은 사전 자체에 대해 반복하기 보다는 사전의 사본을 반복하고 있다는 겁니다.이 방법을 사용하면 필요에 따라 요소를 제거할 수 있다.
참조URL: https://stackoverflow.com/questions/5105517/deep-copy-of-a-dict-in-python
'IT이야기' 카테고리의 다른 글
Vue.js에서 생성된 이벤트와 마운트된 이벤트 간의 차이 (0) | 2022.03.24 |
---|---|
각도2에서 'jquery' 이름을 찾을 수 없음 (0) | 2022.03.23 |
슬롯에서 카테고리 값을 가져오는 방법(일정관리 설정) (0) | 2022.03.23 |
RxJS: shareReplay에서 bufferSize란? (0) | 2022.03.23 |
TypeScript 파일이 변경될 때 ts-node를 감시하고 다시 로드하는 방법 (0) | 2022.03.23 |