注:这是一段更大,更复杂的代码的一部分,其中单行代码在上下文中是有意义的。我知道我可以简单地在列表中写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文档中可以阅读更多有关此行为的信息,以加深我的理解,将不胜感激。
谢谢。
dict.setdefault(key,value)返回与key对应的值,必要时在dict中创建key和value。因此,在此示例中,创建并返回了一个列表,然后将该列表附加到了。
>>> d = {}
>>> d.setdefault('a', [])
[]
>>> d = {}
>>> d.setdefault('a', []).append(1)
>>> d
{'a': [1]}
从docs:
setdefault(键[,默认])
如果键在字典中,则返回其值。如果不是,请插入具有默认值的密钥,然后返回默认值。默认默认为无。