Python 如何阻止值返回';无';?

Python 如何阻止值返回';无';?,python,for-loop,break,Python,For Loop,Break,我试图做一个我正在学习python的书中的实践项目,我被困在练习的第二部分,我应该编写一个代码,将列表添加到字典中 为此,我尝试编写以下代码: def addToInventory(inventory, addedItems): for a in addedItems: if a not in inventory: inventory.setdefault(a, 1) inv = {'gold coi

我试图做一个我正在学习python的书中的实践项目,我被困在练习的第二部分,我应该编写一个代码,将列表添加到字典中

为此,我尝试编写以下代码:

 def addToInventory(inventory, addedItems):
    for a in addedItems:
                   if a not in inventory:
                       inventory.setdefault(a, 1)

inv = {'gold coin': 42, 'rope': 1}
dragonLoot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby']
inv = addToInventory(inv, dragonLoot)
但是,在最后一个for循环之后,库存将返回none,因为它已到达列表的末尾,但这将导致inv为none,并返回一个错误

我在想,当返回值为none时,我可以停止代码,我试图编写一个elif语句,但它不起作用

有什么办法吗


注:即使很明显,请不要为上述内容发布完整的代码,我也愿意自己发布,我只是在寻找这个问题的答案:)。

您不应该将
inv
重新指定给该函数的返回值。它将被更改到位。只要做:

addToInventory(inv, dragonLoot)

函数不返回任何内容,因此inv为None


但丹尼尔的话也能解决问题;-)

您的
inv
被设置为
None
,因为在python中,所有不显式
返回
值的函数都隐式
返回None

按照您定义
addToInventory
的方式,它会隐式地修改
inv
(注意这种副作用,有时这并不是您想要或期望的)

使用函数调用替换
inv=addToInventory(inv,dragonLoot)
的另一种方法是显式地
返回库存。你自己决定喜欢哪种款式

修正: 我知道你要求不要给出完整的代码解决方案,但从你的评论来看,这是我唯一能解释得足够清楚的方法。 正如我们在评论中所讨论的,如果练习的框架给出了代码的其余部分,则需要添加一个显式的
返回。然而,重要的是你把这句话放在哪里。在python中,空格很重要。如果将退货与
inventory.setdefault
对齐,则它将在循环的第一次迭代中执行。要让它在循环中运行然后返回,
return
需要与for处于相同的缩进级别上:

def addToInventory(inventory, addedItems):
    for a in addedItems:
        if a not in inventory:
            inventory.setdefault(a, 1)
    return inventory #<<<<<<< IN LINE WITH THE FOR
def addToInventory(库存、添加项):
对于附录中的a:
如果未在库存中,则:
inventory.setdefault(a,1)

退货库存#我知道,如上所述,但我已经检查了逐步细分,在没有之前,它很好地分配了“ruby”和“dagger”,因此如果我在退货之前停止它,它应该工作。它在停止时工作,因为在那个时候inv仍然有效。但是,由于函数不返回任何内容,因此当函数返回时,您可以在inv=addToInventory(…)行中指定None。@K.Robert请查看我的答案,了解为什么
inv
设置为None。问题在于您,上面的答案是,我应该只填写def.def addToInventory(库存,addedItems)下的代码:#你的代码在这里inv={'gold coin':42,'rope':1}dragonLoot=['gold coin',dagger',gold coin',gold coin',ruby']inv=addToInventory(inv,dragonLoot)displayInventory(inv),然后你错过了
return inventory
语句:)你现在所做的实际上是更新
inv
,但随后您将其丢弃,并使用函数的返回值覆盖它,默认情况下该值为
None
。因此,我在inventory.setdefault语句下添加了返回清单,但是它只添加了字典不包含的列表的第一个值(dagger)。这很有意义,抱歉,如果我让你把头发拔出来:)。它是按照你说的方式工作的,但正如我在GPhilo的回答中提到的,我不应该触碰代码的那部分。