为什么dict.setdefault(value,[])。append(key)起作用?

时间:2019-10-27 18:56:31

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

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

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

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

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

起初,我认为这是因为返回的列表仅在执行该行之后才返回,这似乎很有意义,因此为了进行测试,我将结果分配给dict.setdefault(“ a”, [])转换为变量:

>>> 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文档以加深我的理解,将不胜感激。

谢谢。

1 个答案:

答案 0 :(得分:0)

dict.setdefault(key,value)返回与key对应的值,必要时在dict中创建key和value。因此,在此示例中,创建并返回了一个列表,然后将该列表附加到该列表中。

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

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

来自docs

  

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

     

如果key在字典中,则返回其值。     如果不是,请插入具有默认值的密钥,然后返回默认值。默认默认为无。