如何在字典和列表上调用两个单独的函数?

时间:2019-05-28 21:05:12

标签: python dictionary

我正在执行第5章中的使无聊的东西自动化的练习项目。它要求定义一个具有两个参数(字典和列表)的函数,并使用字典键和列表值之间的每次常见出现来更新数字字典值。

我尝试定义一个函数,当将字典作为参数传递时,它会基于值键对返回列出的清单(第一个练习项目)。然后,我创建了第二个函数来说明要添加到字典清单中的其他项,以列表的形式传递。

backpack = {'gold coin':42, 'rope':1}
dragonLoot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby']

def addToInventory(inventory, addedItems):
    for item in addedItems:
        inventory.setdefault(item,0)
        inventory[item] = inventory[item] + 1




def displayInventory(inv):
    print('Inventory:')
    itemTotal = 0
    for k, v in inv.items():
        print(v, k, sep= ' ')
        itemTotal += v
    print('Total number of items:' + str(itemTotal))



backpack = addToInventory(backpack, dragonLoot)
displayInventory(backpack)

我收到以下错误:

for k, v in inv.items():
AttributeError: 'NoneType' object has no attribute 'items'

我已经尝试过,但是看不到错误,特别是自从第一个返回值键清单的项目以来,它工作正常,并且与displayInventory()函数基本相同。

我本来可以很容易找到解决方案,但想具体了解我要去哪里。谢谢

3 个答案:

答案 0 :(得分:3)

在您的addToInventory函数中,您没有返回修改后的字典,但希望在最后在代码中调用它时将返回它。由于该函数未返回任何内容,因此默认情况下将返回None,因此您的displayInventory函数试图遍历NoneType变量。因为Python中的dictionary is passed by reference,所以您可以修改字典而不必返回任何内容。致电backpack之后,只需删除对addToInventory的分配即可:

addToInventory(backpack, dragonLoot)

当您这样做时,我们将获得预期的输出:

Inventory:
45 gold coin
1 rope
1 dagger
1 ruby
Total number of items:48

答案 1 :(得分:1)

您的函数调用

backpack = addToInventory(backpack, dragonLoot)

不返回任何内容,因此您的背包变量默认为None,因此出现NoneType错误。

要解决此问题,请在调用函数时删除对背包的分配:

addToInventory(backpack, dragonLoot)

答案 2 :(得分:0)

正在发生的事情是您正在将变量背包重新分配给addToInventory的输出。但是,addToInventory不返回任何值,因此默认情况下将背包分配为“无”。当您将包含None的背包变量传递给displayInventory函数时,就会发生NoneType错误。