Raffy Harvey
Raffy Harvey

Reputation: 1

Why is my dictionary being wiped after adding to it?

Currently working through the 'Automate the Boring Stuff' python tutorial and was completing an exercise at the end of the tutorial section.

I'm finding that when I add the information from a list into the main dictionary it works, but then after the function completes it seems to wipe the dictionary's contents.

inv = {'gold coin': 42, 'rope': 1}

def addToInventory(dict, addedItems):
    
    for i in addedItems:
        if i not in dict:
            dict[i] = 1
        else:
            dict[i] = dict[i] + 1
        print(dict) #this exists so that I could check it wasn't a weird thing in the definition

def displayInventory(inventory):
    print("Inventory:")
    item_total = 0
    for k, v in inventory.items():
        print(v, k)
        item_total += v
    print("Total number of items: " + str(item_total))


dragonLoot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby']
inv = addToInventory(inv, dragonLoot)

displayInventory(inv) #the dictionary appears as empty

Upvotes: 0

Views: 78

Answers (2)

Wizard.Ritvik
Wizard.Ritvik

Reputation: 11621

A minor note for code refactoring purposes. I noticed that in your func addToInventory, there exists the following logic:

if i not in dict:
    dict[i] = 1
else:
    dict[i] = dict[i] + 1

That could actually, be simplified just a little bit:

dict[i] = dict.get(i, 0) + 1     

Or again a little further, using a defaultdict:

from collections import defaultdict


def addToInventory(dict, addedItems):
    for i in addedItems:
        dict[i] += 1
        print(dict)  # this exists so that I could check it wasn't a weird thing in the definition


inv = defaultdict(int, **{'gold coin': 42, 'rope': 1})

But now on to the meat of the issue you were actually noticing / asking about. As indicated in the comments, that can be resolved in one of two ways. One approach could be to simply add a return statement at the end of the function body:

def addToInventory(dict, addedItems):
    for i in addedItems:
        if i not in dict:
            dict[i] = 1
        else:
            dict[i] = dict[i] + 1
    # --> ADD this, here
    return dict

Or simply, without the return statement:

# return value is None, but let's say we still want to capture the `None` value
_ = addToInventory(inv, dragonLoot)

Upvotes: 0

Addison Schmidt
Addison Schmidt

Reputation: 484

addToInventory doesn't return anything, so inv = addToInventory(inv, dragonLoot) causes inv to be None. What you want instead is to just call addToInventory(inv, dragonLoot), which updates inv.

Upvotes: 3

Related Questions