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

2024-06-16 13:29:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我在做《自动化无聊的东西》第五章的练习项目。它要求用两个参数(一个字典和一个列表)定义一个函数,并要求用字典键和列表值之间的每一个常见匹配项更新数字字典值

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

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'

我已经试过了,但看不到错误,特别是在第一个项目返回值键inventory之后,工作正常,基本上与displayInventory()函数相同

我本可以很容易地找到解决办法,但我想知道我到底错在哪里。谢谢


Tags: 项目函数in列表for字典itemsitem
3条回答

addToInventory函数中,您不返回修改过的字典,而是希望在代码末尾调用它时返回它。因为函数中没有返回任何内容,所以它默认返回None,所以您的displayInventory函数试图在NoneType变量上循环。因为Python中有一个dictionary is passed by reference,所以可以修改字典而不必返回任何内容。在调用addToInventory之后,只需删除对backpack的赋值:

addToInventory(backpack, dragonLoot)

当您这样做时,我们就得到了预期的输出:

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

对的函数调用

backpack = addToInventory(backpack, dragonLoot)

没有返回任何内容,因此您的backpack变量默认为None,因此出现NoneType错误

要解决此问题,请在调用函数时删除对backpack的赋值:

addToInventory(backpack, dragonLoot)

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

相关问题 更多 >