首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么python dict.update()不返回对象?

为什么python dict.update()不返回对象?
EN

Stack Overflow用户
提问于 2009-09-21 05:20:43
回答 8查看 72.9K关注 0票数 184

我想做的是:

award_dict = {
    "url" : "http://facebook.com",
    "imageurl" : "http://farm4.static.flickr.com/3431/3939267074_feb9eb19b1_o.png",
    "count" : 1,
}

def award(name, count, points, desc_string, my_size, parent) :
    if my_size > count :
        a = {
            "name" : name,
            "description" : desc_string % count,
            "points" : points,
            "parent_award" : parent,
        }
        a.update(award_dict)
        return self.add_award(a, siteAlias, alias).award

但是如果我觉得这个函数真的很笨重,我宁愿这样做:

        return self.add_award({
            "name" : name,
            "description" : desc_string % count,
            "points" : points,
            "parent_award" : parent,
        }.update(award_dict), siteAlias, alias).award

为什么update不返回对象,这样你就可以链接?

JQuery这样做是为了进行链接。为什么它在python中是不可接受的?

EN

回答 8

Stack Overflow用户

发布于 2009-09-21 05:29:52

按照惯例,Python的API区分了过程和函数。函数从它们的参数(包括任何目标对象)计算出新值;过程修改对象并且不返回任何东西(即它们返回None)。所以过程有副作用,函数没有。update是一个过程,因此它不返回值。

这样做的动机是,否则,你可能会得到不想要的副作用。考虑一下

bar = foo.reverse()

如果reverse (就地反转列表)也会返回列表,用户可能会认为reverse返回一个分配给bar的新列表,而不会注意到foo也会被修改。通过使反向返回为None,他们立即认识到条形不是反向的结果,并将更接近反向的效果。

票数 40
EN

Stack Overflow用户

发布于 2018-11-14 23:27:02

这很简单,因为:

(lambda d: d.update(dict2) or d)(d1)

或者,如果不修改字典很重要:

(lambda d: d.update(dict2) or d)(d1.copy())
票数 29
EN

Stack Overflow用户

发布于 2012-05-24 12:50:14

>>> dict_merge = lambda a,b: a.update(b) or a
>>> dict_merge({'a':1, 'b':3},{'c':5})
{'a': 1, 'c': 5, 'b': 3}

注意,除了返回合并的dict之外,它还就地修改了第一个参数。所以dict_merge( a,b)会修改a。

当然,您也可以全部内联完成:

>>> (lambda a,b: a.update(b) or a)({'a':1, 'b':3},{'c':5})
{'a': 1, 'c': 5, 'b': 3}
票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1452995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档