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

Python将一个字典复制为键值的有效方法,python,dictionary,Python,Dictionary,我正在用python开发一个监视工具。 它有一个全局字典,所有主机作为键,其详细信息作为值 目前我是这样做的: host = hostname hostDictionary["a"] = a hostDictionary["b"] = b hostDictionary["c"] = c globalDictionary[host] = hostDictionary globalDictionary[host] = dict(hostDictionary.items()) 我的问题是: 这是将

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

目前我是这样做的:

host = hostname
hostDictionary["a"] = a
hostDictionary["b"] = b
hostDictionary["c"] = c
globalDictionary[host] = hostDictionary
globalDictionary[host] = dict(hostDictionary.items())
我的问题是:

  • 这是将整个hostDictionary复制到global的键中,还是只是引用它

  • 有更好的方法吗

  • 这个快吗

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

  • 1\2-它是一个参考,您需要以这种方式复制

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

    3-我不这么认为,我认为复制到所有对象可能比访问每个元素更快。

    1\2-这是一个参考,您需要以这种方式进行复制

    from copy import copy  
    globalDictionary[host] = copy(hostDictionary)
    
    3-我不这么认为,我认为复制到所有对象可能比访问每个元素更快

  • 不,它不是复制整本词典,只是引用它。要检查这一点,最好的方法是:

    host = 'hostname'
    hostDictionary = {}
    globalDictionary = {}
    hostDictionary["a"] = a
    hostDictionary["b"] = b
    hostDictionary["c"] = c
    globalDictionary[host] = hostDictionary`
    
    检查它-

    globalDictionary[host] is hostDictionary
    
    输出-

    True 
    
    这意味着两者都有相同的id

  • 要复制,必须使用,
    copy()
    deepcopy()

    这会给你一个
    False
    ,并证明它被复制了

  • 这实际上取决于你的目的。但在任何情况下,直接分配显然更快

  • 不,它不是复制整本词典,只是引用它。要检查这一点,最好的方法是:

    host = 'hostname'
    hostDictionary = {}
    globalDictionary = {}
    hostDictionary["a"] = a
    hostDictionary["b"] = b
    hostDictionary["c"] = c
    globalDictionary[host] = hostDictionary`
    
    检查它-

    globalDictionary[host] is hostDictionary
    
    输出-

    True 
    
    这意味着两者都有相同的id

  • 要复制,必须使用,
    copy()
    deepcopy()

    这会给你一个
    False
    ,并证明它被复制了

  • 这实际上取决于你的目的。但在任何情况下,直接分配显然更快


  • 我从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}
    
    这意味着:

  • 您只是在
    globalDictionary
    的键中引用了
    hostDictionary
    。如果您想要副本,请像hashcode55所说的那样调用
    hostDictionary.copy()
    hostDictionary.deepcopy()

  • “更好”取决于您的用例。例如,您可以声明
    hostDictionary={'a':a,'b':b,'c':c}

  • 在Python解释器端执行您放在那里的操作要慢一些,因为(假设没有内置任何东西来优化返回到原始示例的内容),引擎在编写之前需要查找由
    globalDictionary[host]
    引用的每个操作的对象


  • 我从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}
    
    这意味着:

  • 您只是在
    globalDictionary
    的键中引用了
    hostDictionary
    。如果您想要副本,请像hashcode55所说的那样调用
    hostDictionary.copy()
    hostDictionary.deepcopy()

  • “更好”取决于您的用例。例如,您可以声明
    hostDictionary={'a':a,'b':b,'c':c}

  • 在Python解释器端执行您放在那里的操作要慢一些,因为(假设没有内置任何东西来优化返回到原始示例的内容),引擎在编写之前需要查找由
    globalDictionary[host]
    引用的每个操作的对象


  • 我想如果你像这样初始化dict会更快

    lobalDictionary[host] = {
        "a": a,
        "b": b,
        "c": c
    }
    
    此外,如果您不想使用copy或deepcopy,您可以按如下方式复制词典:

    host = hostname
    hostDictionary["a"] = a
    hostDictionary["b"] = b
    hostDictionary["c"] = c
    globalDictionary[host] = hostDictionary
    
    globalDictionary[host] = dict(hostDictionary.items())
    


    我想如果你像这样初始化dict会更快

    lobalDictionary[host] = {
        "a": a,
        "b": b,
        "c": c
    }
    
    此外,如果您不想使用copy或deepcopy,您可以按如下方式复制词典:

    host = hostname
    hostDictionary["a"] = a
    hostDictionary["b"] = b
    hostDictionary["c"] = c
    globalDictionary[host] = hostDictionary
    
    globalDictionary[host] = dict(hostDictionary.items())
    


    “这是将整个hostDictionary复制到global的键中还是只是引用它?”它只是引用它,例如
    a={};b={'a':a};b['a']是a==True
    。“有更好的方法吗?”也许。你能更详细地解释一下你想要达到的目标吗?“这更快吗?”我的猜测可能不是,因为索引的开销要大得多。它目前需要多长时间,需要多快?在绝大多数情况下,这种优化都是微不足道的,不值得花时间仔细考虑。@ali\m我正在创建一个包含所有主机的字典,其中包含详细信息。然后是一个全局dict,其中主机作为键,它的所有值作为细节。有了这个,我可以为任何主机查询一次全局dict,而不是查找ip dict并查询它,如果它的任何属性发生变化,任何其他功能也可以编辑它。“这是将整个hostDictionary复制到全局的键中还是只是引用它?”它只是引用它,例如
    a={};b={'a':a};b['a']是a==True
    。“有更好的方法吗?”也许。你能更详细地解释一下你想要达到的目标吗?“这更快吗?”我的猜测可能不是,因为索引的开销要大得多。它目前需要多长时间,需要多快?在绝大多数情况下,这种优化都是微不足道的,不值得花时间仔细考虑。@ali\m我正在创建一个包含所有主机的字典,其中包含详细信息。然后是一个全局dict,其中主机作为键,它的所有值作为细节。有了这个,我可以为任何主机查询一次全局dict,而不是查找ip dict并查询它,如果它的任何属性发生变化,任何其他功能也可以编辑它。