我有一个小函数,它没有做我想做的事情,我不知道为什么。该函数应该将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
,因此frank
是None
。有关更多信息,请参阅为什么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']}}