Python有效的方法将一个字典复制为键的值

时间:2016-07-20 21:51:24

标签: python dictionary

我正在使用python中的监视工具。 它有一个全局字典,所有主机都作为键,其详细信息为值。

目前我这样做:

host = hostname
hostDictionary["a"] = a
hostDictionary["b"] = b
hostDictionary["c"] = c
globalDictionary[host] = hostDictionary

我的问题是:

  1. 这是将整个hostDictionary复制到全局键还是只引用它?

  2. 有更好的方法吗?

  3. 这更快吗?

    globalDictionary[host]["a"] = a
    globalDictionary[host]["b"] = b
    globalDictionary[host]["c"] = c
    

4 个答案:

答案 0 :(得分:1)

1 \ 2 - 这是一个参考,您需要以这种方式制作副本。

from copy import copy  
globalDictionary[host] = copy(hostDictionary)

3 - 我不这么认为,我认为所有对象的副本可以比访问每个元素更快。

答案 1 :(得分:1)

  1. 不是,它不是复制整个字典,只是引用它。要检查这一点,最好的方法是这样做 -

    host = 'hostname'
    hostDictionary = {}
    globalDictionary = {}
    hostDictionary["a"] = a
    hostDictionary["b"] = b
    hostDictionary["c"] = c
    globalDictionary[host] = hostDictionary`
    

    检查 -

    globalDictionary[host] is hostDictionary
    

    输出 -

    True 
    

    这意味着两者都具有相同的身份。

  2. 要复制,您必须使用copy()deepcopy()

    globalDictionary[host] = hostDictionary.copy()
    globalDictionary[host] is hostDictionary
    

    给你False并证明它被复制。

  3. 实际上取决于你的目的。但无论如何,直接分配显然更快。

答案 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}

这意味着:

  1. 您只是在hostDictionary的密钥中引用globalDictionary。如果您需要副本,请致电hostDictionary.copy()hostDictionary.deepcopy(),例如hashcode55表示。

  2. "更好的"取决于你的用例。但你可以刚刚宣布hostDictionary = {'a': a, 'b': b, 'c': c},例如。

  3. 在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()}