Oli*_*ire 290 python python-3.x
我想dict在python中制作一个深层副本.不幸的是,该.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
Run Code Online (Sandbox Code Playgroud)
最后一行应该是3.
我希望这些修改my_dict不会影响快照my_copy.
我怎么做?该解决方案应与Python 3.x兼容.
ang*_*son 415
怎么样:
import copy
d = { ... }
d2 = copy.deepcopy(d)
Run Code Online (Sandbox Code Playgroud)
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
>>>
Run Code Online (Sandbox Code Playgroud)
the*_*der 30
dict.copy()是一个浅复制函数,用于字典
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
Run Code Online (Sandbox Code Playgroud)
键'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
Run Code Online (Sandbox Code Playgroud)
或者您可以使用上面提到的深度复制.
xpr*_*ros 14
Python 3.x
从复制导入deepcopy
my_dict = {'one': 1, 'two': 2}
new_dict_deepcopy = deepcopy(my_dict)
Run Code Online (Sandbox Code Playgroud)
没有深度复制,我无法从我的域字典中删除主机名字典.
没有深度复制我收到以下错误:
"RuntimeError: dictionary changed size during iteration"
Run Code Online (Sandbox Code Playgroud)
...当我尝试从另一个字典里面的字典中删除所需的元素时.
import socket
import xml.etree.ElementTree as ET
from copy import deepcopy
Run Code Online (Sandbox Code Playgroud)
domain是一个字典对象
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
Run Code Online (Sandbox Code Playgroud)
示例输出:[ orginal ] domains = {'localdomain':{'localhost':{'all':'4000'}}}
[new] domains = {'localdomain':{}}}
所以这里发生的事情是我正在迭代字典的副本而不是遍历字典本身.使用此方法,您可以根据需要删除元素.
| 归档时间: |
|
| 查看次数: |
192931 次 |
| 最近记录: |