DIctionary确实按预期更新了字符串的内部列表;返回None



我有一个小函数,它没有做我想做的事情,我不知道为什么。该函数应该将new_text字符串添加到wordclouds字典中的text列表中。

def update(wordclouds, source, new_text):
if source in wordclouds:
old_text = wordclouds[source]['text']
frank = old_text.append(new_text)
wordclouds[source]['text'] = frank
else:
wordclouds[source] = {"text": [new_text]}
return wordclouds

但是,当我运行该函数时,我会得到text列表的None,如下所示。

>>> w = {}
>>> w = update(w, 'fred', 'I am happy')
>>> w
{'fred': {'text': ['I am happy']}}
>>> w = update(w, 'fred', 'I am not happy')
>>> w
{'fred': {'text': None}}
>>> 

函数的第一次传递给出了预期的结果:{'fred': {'text': ['I am happy']}}。但是由于某种原因,对函数的第二次调用返回字典中text字段的None。我期待{'fred': {'text': ['I am happy', 'I am not happy']}}

如果我把代码改成这样:

def update(wordclouds, source, new_text):
if source in wordclouds:
#old_text = wordclouds[source]['text']
#frank = old_text.append(new_text)
wordclouds[source]['text'].append(new_text)
else:
wordclouds[source] = {"text": [new_text]}
return wordclouds

它按预期工作:

>>> w = {}
>>> w = update(w, 'fred', 'I am happy')
>>> w
{'fred': {'text': ['I am happy']}}
>>> w = update(w, 'fred', 'I am not happy')
>>> w
{'fred': {'text': ['I am happy', 'I am not happy']}}
>>> 

我一定错过了一些关于字典和函数的基本内容,但我就是看不到。为什么在对update函数的第一个示例的第二次调用中,text列表被设置为None,而不是第二次?

谢谢!

list.append()返回None,因此frankNone。有关更多信息,请参阅为什么append((在Python中总是返回None?

update()的第二个实现是正确的,但在与list.append()相同的方面,由于它正在改变wordclouds,所以不应该返回wordclouds。就其价值而言,您可以使用dict.setdefault():来简化它

def update(wordclouds, source, new_text):
d = wordclouds.setdefault(source, {})
d.setdefault("text", []).append(new_text)
>>> w = {}
>>> update(w, 'fred', 'I am happy')
>>> w
{'fred': {'text': ['I am happy']}}
>>> update(w, 'fred', 'I am not happy')
>>> w
{'fred': {'text': ['I am happy', 'I am not happy']}}

最新更新