IT이야기

python에서 받아쓰기의 깊은 사본

cyworld 2022. 3. 23. 00:42
반응형

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

반응형