dict中的价值不会让我改变它

时间:2015-09-16 06:50:07

标签: python dictionary

我正在尝试编写一个更新字典中值的程序。

stuff = {'rope': 1, 'torch': 6, 'gold coin': 42, 'dagger': 1, 'arrow': 12}
dragonLoot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby']

#stuff = addToInventory(stuff, dragonLoot)
for i in range(len(dragonLoot)):
        for k, v in stuff.items():
            if dragonLoot[i] == k:
                v += 1

displayInventory(stuff)

正如您所看到的,我已经在我的主要部分中移动了片段,以确保它不是该功能的问题。外部for循环也有效。问题是,v只是更新了。 displayInventory()打印与顶部声明中相同的值。

提前感谢您的意见!

7 个答案:

答案 0 :(得分:1)

v确实已更新,问题是您没有将其分配回stuff[k],因此新值会丢失。

修复它
for i in range(len(dragonLoot)):
    for k, v in stuff.items():
        if dragonLoot[i] == k:
            stuff[k] = v + 1

答案 1 :(得分:1)

v确实已更新,但stuff[k]没有更新 - 它们是相同的值(最初),但不是相同的变量。您需要将新值分配给stuff[k],而不是v

答案 2 :(得分:1)

您可以使用以下方法:

stuff = {'rope': 1, 'torch': 6, 'gold coin': 42, 'dagger': 1, 'arrow': 12}
dragonLoot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby']

for item in dragonLoot:     
    stuff[item] = stuff.get(item, 0) + 1

print stuff

给你:

{'gold coin': 45, 'dagger': 2, 'torch': 6, 'rope': 1, 'arrow': 12, 'ruby': 1}

stuff.get(item, 0)从字典中返回item,但如果它不存在(例如ruby),则返回默认值0。我只需在值中添加一个并将其分配回字典。

答案 3 :(得分:1)

Python中的+=运算符很棘手。对于某些类型,它将修改左侧引用的对象。然而,在其他情况下,这是不可能的(因为类型是不可变的)。在这些情况下,它会将左侧重新绑定到新对象。这不会改变对其他地方可能存在的旧值的其他引用。

您可以在更简单的场景中了解这一点:

x = 1
y = x    # reference to the same int object
y += 1   # can't modify 1 in place, so only rebinds
print(x) # prints 1 still

在您的代码中,xstuff[k](通过循环隐式访问),yv。您需要编写stuff[k] = v+1以使代码按照您的意愿执行。

答案 4 :(得分:0)

stuff.items() 返回由kv组成的元组。

kv都是新的和不同的名称。 元组和整数是不可变的,所以当你执行v += 1时,python会创建一个值为updated的新对象。 原始的stuff词典保持不变。

使用

stuff[k] = v+1

代替

答案 5 :(得分:0)

整数是基元,而不是引用。因此,当i=0k='gold coin'v 指向为1时,v 1.然后你加1,它变成2,但stuff根本没有变化。

您需要通过编写

明确更改stuff
stuff[k] += 1

而不是向v添加一个。

答案 6 :(得分:0)

如果您想计算冒险者携带的物品,最好使用Counter。它们从0开始自动启动,让您简化逻辑:

from collections import Counter

stuff = Counter({'rope': 1, 'torch': 6, 'gold coin': 42, 'dagger': 1, 'arrow': 12})
dragonLoot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby']

for loot in dragonLoot:
    stuff[loot] += 1