注意:这是一段更大,更复杂的代码的一部分,在给定上下文的情况下,单行代码才有意义。我知道我可以简单地在列表中写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文档以加深我的理解,将不胜感激。
谢谢。
答案 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在字典中,则返回其值。 如果不是,请插入具有默认值的密钥,然后返回默认值。默认默认为无。