我正在使用python中的监视工具。 它有一个全局字典,所有主机都作为键,其详细信息为值。
目前我这样做:
host = hostname
hostDictionary["a"] = a
hostDictionary["b"] = b
hostDictionary["c"] = c
globalDictionary[host] = hostDictionary
我的问题是:
这是将整个hostDictionary复制到全局键还是只引用它?
有更好的方法吗?
这更快吗?
globalDictionary[host]["a"] = a
globalDictionary[host]["b"] = b
globalDictionary[host]["c"] = c
答案 0 :(得分:1)
1 \ 2 - 这是一个参考,您需要以这种方式制作副本。
from copy import copy
globalDictionary[host] = copy(hostDictionary)
3 - 我不这么认为,我认为所有对象的副本可以比访问每个元素更快。
答案 1 :(得分:1)
不是,它不是复制整个字典,只是引用它。要检查这一点,最好的方法是这样做 -
host = 'hostname'
hostDictionary = {}
globalDictionary = {}
hostDictionary["a"] = a
hostDictionary["b"] = b
hostDictionary["c"] = c
globalDictionary[host] = hostDictionary`
检查 -
globalDictionary[host] is hostDictionary
输出 -
True
这意味着两者都具有相同的身份。
要复制,您必须使用copy()
或deepcopy()
globalDictionary[host] = hostDictionary.copy()
globalDictionary[host] is hostDictionary
给你False
并证明它被复制。
实际上取决于你的目的。但无论如何,直接分配显然更快。
答案 2 :(得分:1)
我是从Python CLI获得的:
>>> a = {}
>>> b = {}
>>> c = {}
>>> a["foo"] = 1
>>> b = a
>>> c = a.copy()
>>> b["bar"] = 2
>>> a
{'foo': 1, 'bar': 2}
>>> b
{'foo': 1, 'bar': 2}
>>> c
{'foo': 1}
这意味着:
您只是在hostDictionary
的密钥中引用globalDictionary
。如果您需要副本,请致电hostDictionary.copy()
或hostDictionary.deepcopy()
,例如hashcode55表示。
"更好的"取决于你的用例。但你可以刚刚宣布hostDictionary = {'a': a, 'b': b, 'c': c}
,例如。
在Python解释器方面做你放在那里的东西要慢一点,因为(假设没有内置的东西来优化回到原来的例子)引擎需要看看在编写之前为每个操作添加globalDictionary[host]
引用的对象。
答案 3 :(得分:1)
我认为如果你像这样初始化dict会更快
lobalDictionary[host] = {
"a": a,
"b": b,
"c": c
}
此外,如果您不想使用复制或深度复制,您可以像这样复制字典:
globalDictionary[host] = dict(hostDictionary.items())
或
globalDictionary[host] = {k:v for k,v in hostDictionary.items()}