【问题标题】:update method of python dictionary did not workpython字典的更新方法不起作用
【发布时间】:2014-12-26 15:01:21
【问题描述】:

我有两本字典。

a = {"ab":3, "bd":4}
b = {"cd":3, "ed":5}` 

我想将它们合并到{'bd': 4, 'ab': 3, 'ed': 5, 'cd': 3}

正如this 所说,a.update(b) 可以完成它。但是当我尝试时,我得到:

type(a.update(b)) #--> type 'NoneType'

有人愿意向我解释为什么我无法获得 dict 类型吗?

我也试过这个,效果很好:

type(dict(a,**b)) #-->type 'dict'

这两种方法有什么区别,为什么第一种不行?

【问题讨论】:

  • 它不返回第 3 部字典,而是原地更新。
  • 你的意思是我不能将结果存储在第三个变量中?
  • 你可以,但会是None
  • @wanglan 你可以用你的第二种方法。
  • 为什么投反对票?这对我来说也是一件非常令人沮丧的事情。在来自其他语言时,我完全期望 mydict.update(otherdict) 返回对 dict 的引用,直到我了解了 python 变量名称和对象模型。

标签: python dictionary


【解决方案1】:

update 方法就地更新字典。它返回None,就像list.extend 一样。要查看结果,请查看您更新的字典。

>>> a = {"ab":3, "bd":4}
>>> b = {"cd":3, "ed":5}
>>> update_result = a.update(b)
>>> print(update_result)
None
>>> print(a)
{'ed': 5, 'ab': 3, 'bd': 4, 'cd': 3}

如果您希望结果是第三个单独的字典,则不应使用update。请改用dict(a, **b) 之类的东西,正如您已经注意到的那样,它从两个组件构造一个新的字典,而不是更新现有的一个。

【讨论】:

    【解决方案2】:

    作为一个新的 Python 用户,这对我来说是一个非常频繁的“陷阱”,因为我似乎总是忘记它。

    正如您所推测的,a.update(b) 返回 None,就像 a.append(b) 将返回 None 以获得列表一样。这类方法(list.extend 是另一种方法)就地更新数据结构

    假设您实际上不想修改 a,试试这个:

    c = dict(a)  # copy a
    c.update(b)  # update a using b
    type(c)  #returns a dict
    

    应该可以的。

    另一种更短的方式:

    c = dict(a,**b)
    type(c)  #returns a dict
    

    这里发生的是b 正在解包。这仅在 b 的键都是字符串时才有效,因为您实际上在做的是:

    c = dict(a, cd=3, ed=5)
    type(c)  #returns a dict
    

    请注意,对于上述任何一种方法,如果a 中的任何键在b 中重复,则b 值将替换a 值,例如:

    a = {"ab":3, "bd":4}
    c = dict(a, ab=5)
    c  #returns  {"ab":5, "bd":4}
    

    【讨论】:

      【解决方案3】:

      dict.update() 返回None,就像大多数修改容器的方法一样(list.append()list.sort()set.add() 等)。这是设计使然,因此您不会误以为它会创建一个新的 dict(或 list 等)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-29
        • 1970-01-01
        • 2019-02-22
        • 2016-12-07
        • 1970-01-01
        • 2011-05-08
        • 1970-01-01
        • 2019-05-20
        相关资源
        最近更新 更多