【问题标题】:Copy a dictionary into a new variable without maintaining the link with previous one将字典复制到新变量中,而不保持与前一个变量的链接
【发布时间】:2012-01-07 18:02:07
【问题描述】:

我想将字典复制到新变量中,而不维护与先前变量的链接。

【问题讨论】:

标签: python python-3.x


【解决方案1】:
from copy import deepcopy

new_dict = deepcopy(orig_dict)

dict.copy() 创建浅拷贝,这意味着,如果您的字典包含其他容器对象,如列表、元组等。它们将被再次引用而不是重复!

您可以自己尝试:

a = {1:{1:2}}
print id(a[1])
>>> 159584844

b = a.copy()
print id(b[1])
>>> 159584844

c = deepcopy(a)
print id(c[1])
>>> 159575276

【讨论】:

  • 根据 OP 的要求,这并不总是一个问题。不过,他在细节上相当稀疏。如果.copy 从来都不是一个好工具,那它为什么存在?
  • .copy 是一个很好的工具,但正如你提到的,OP 非常模糊,所以我对他的问题的解释与你略有不同。我什至不记得我是否曾经在非实验代码中使用过 deepcopy。
  • 重点...我想回答这些问题可能有点像读心游戏吧?
【解决方案2】:

字典上的.copy 方法就足够了。

dict1 = {'foo': 'bar'}
dict2 = dict1.copy()

dict1['bar'] = 'baz'
dict2['bar'] = 'bif'

print(dict1, dict2)

这些输出:

{'foo': 'bar', 'bar': 'baz'} {'foo': 'bar', 'bar': 'bif'}

如果您想完全删除对dict1 的引用,您可以只使用del dict1

如果您担心字典内部对变量的引用,可以使用copy 模块中的deepcopy

【讨论】:

    【解决方案3】:

    dict.copy method

    没有“将对象复制到新变量”之类的东西。你可以复制一个对象;这会创建一个新对象。一个对象可能有 0、1 或多个名称(您称之为“变量”)。是否给新对象命名取决于您——例如foo = d.copy() - 或者让它无名 - 例如some_function(d.copy()).

    可以使用浅拷贝或深拷贝来复制对象。请参阅copy module。深层副本是否实现了“不维护与先前变量的链接”的意思?如果不是,请澄清。

    【讨论】:

    • +1 表示对 Python 中这个可怕的表达式的评论:“copy ... INTO a new variable”
    【解决方案4】:

    您可以使用 dict.pop() 访问 dict 的条目并在一个步骤中将其删除。这是一个dict dd的创建,然后从dd中提取条目并构造zz:

    >>> dd = dict(zip("ABC","123"))
    >>> print dd
    {'A': '1', 'C': '3', 'B': '2'}
    >>> zz = dict((k,dd.pop(k)) for k in dd.keys())
    >>> print zz
    {'A': '1', 'C': '3', 'B': '2'}
    >>> print dd
    {}
    

    所以在创建 zz 之后,所有的值都已从 dd 中删除。如果您想做一些选择性的事情,请在字典中添加 if condition

    >>> dd = dict(zip("ABCDEFGHIJKLMNOPQRSTUVWXYZ", range(1,27)))
    >>> vowels = "AEIOU"
    >>> zz = dict((k,dd.pop(k)) for k in dd.keys() if k not in vowels)
    >>> dd
    {'A': 1, 'E': 5, 'I': 9, 'O': 15, 'U': 21}
    >>> zz
    {'C': 3, 'B': 2, 'D': 4, 'G': 7, 'F': 6, 'H': 8, 'K': 11, 'J': 10, 'M': 13, 'L': 12, 'N': 14, 'Q': 17, 'P': 16
    , 'S': 19, 'R': 18, 'T': 20, 'W': 23, 'V': 22, 'Y': 25, 'X': 24, 'Z': 26}
    

    【讨论】:

      猜你喜欢
      • 2016-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-24
      • 2015-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多