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

问题描述 投票:0回答:1

注:这是一段更大,更复杂的代码的一部分,其中单行代码在上下文中是有意义的。我知道我可以简单地在列表中写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文档中可以阅读更多有关此行为的信息,以加深我的理解,将不胜感激。

谢谢。

python-3.x list class dictionary instance
1个回答
0
投票

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

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

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

docs

setdefault(键[,默认])

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

© www.soinside.com 2019 - 2024. All rights reserved.