【问题标题】:Why does dict.setdefault(value,[]).append(key) work?为什么 dict.setdefault(value,[]).append(key) 工作?
【发布时间】:2020-02-23 05:08:51
【问题描述】:

注意:这是一段更大、更复杂的代码的一部分,考虑到上下文,这行代码是有意义的。我知道我可以简单地在列表中写 1。

我所指的代码来自另一个问题: How to implement an efficient bidirectional hash table?

无论如何,我不明白为什么可以附加返回值列表,以及为什么该更改反映在字典中包含的列表中。据我所知,返回的值是列表的某种副本,而不是字典中的列表本身:

>>> dict = {}
>>> dict.setdefault("a",[]).append(1)
>>> print(dict)
>>> {"a": [1]}
>>> dict = {}
>>> l = dict.setdefault("a",[])
>>> l.append(1)
>>> print(l)
>>> [1]
>>> print(dict)
>>> {"a": [1]}

更奇怪的是,直接追加到列表中是行不通的。直接说,我的意思是:

>>> dict = {}
>>> dict.setdefault("a",[].append(1))
>>> print(dict)
>>> {"a": None}    

所以我没想到的是实际发生的事情(更改返回值并对该值的副本进行更改),而我认为不可能的事情不是(直接附加到列表)。

如果有人知道这是为什么,并且我可以在其中阅读有关此行为的更多信息以加深我的理解,那将不胜感激。

谢谢。

【问题讨论】:

    标签: python-3.x list class dictionary instance


    【解决方案1】:

    dict.setdefault(key, value) 返回key对应的值,必要时在dict中创建key和value。所以在示例中,创建并返回一个列表,然后将列表追加到。

    >>> d = {}
    >>> d.setdefault('a', [])
    []
    
    >>> d = {}
    >>> d.setdefault('a', []).append(1)
    >>> d
    {'a': [1]}
    

    来自docs

    设置默认值(键[,默认值])

    如果键在字典中,则返回其值。 如果不是,则插入值为默认值的键并返回默认值。默认默认为无。

    【讨论】:

    • 谢谢,但我已经明白了。我不明白的是为什么返回时可以修改字典中的列表,例如:dict.setdefault("a",[]).append(1),以及为什么不能附加所述字典中的列表直接喜欢这样:[].append(1)
    • @user2901512:因为它是同一个列表,而不是副本(Python 几乎从不复制)。 [].append(1) 的问题是 append 只会改变列表而不返回它;这样创建一个列表,然后将 1 附加到它,然后丢弃该列表并返回 None (附加的返回值)。
    猜你喜欢
    • 1970-01-01
    • 2012-04-18
    • 2011-10-25
    • 2011-05-16
    • 2015-07-22
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    • 2016-01-11
    相关资源
    最近更新 更多