Python 以dict-won'表示的价值;别让我改变它

Python 以dict-won'表示的价值;别让我改变它,python,dictionary,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)): f

我正试图写一个程序来更新字典中的值

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)
正如您所看到的,我已经移动了main中的代码段,以确保它与函数没有问题。外部for循环也可以工作。问题是,
v
无法更新<代码>显示库存()打印与顶部声明中相同的值


提前感谢您的输入

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

把它修好

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

v
确实会得到更新,问题是您没有将其重新分配给
stuff[k]
,因此新值会丢失

把它修好

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

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

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

stuff.items()
返回由
k
v
组成的元组

k
v
都是新的、不同的名称。 元组和整数是不可变的,所以当您执行
v+=1
操作时,python将创建一个值更新的新对象。 原始的
资料
词典保持不变

使用

取而代之的是stuff.items()


返回由
k
v
组成的元组

k
v
都是新的、不同的名称。 元组和整数是不可变的,所以当您执行
v+=1
操作时,python将创建一个值更新的新对象。 原始的
资料
词典保持不变

使用


相反

整数是基元,而不是引用。因此,当
i=0
k='gold coin'
时,
v
不是指向1,
v
是1。然后你给它加上1,它就变成了2,但是
stuff
一点也不改变

您需要通过编写

stuff[k] += 1

整数不是向
v

添加一个,而是一个基元,而不是一个引用。因此,当
i=0
k='gold coin'
时,
v
不是指向1,
v
是1。然后你给它加上1,它就变成了2,但是
stuff
一点也不改变

您需要通过编写

stuff[k] += 1

您可以使用以下方法,而不是向
v

添加一个:

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
。然后我将一个添加到值中,并将其分配回字典。

您可以使用以下方法:

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)
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
。然后我将一个值添加到值中,并将其分配回字典。

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

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)
您可以在更简单的场景中了解这一点:

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

在代码中,
x
stuff[k]
(通过循环隐式访问),而
y
v
。您需要编写
stuff[k]=v+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

在代码中,
x
stuff[k]
(通过循环隐式访问),而
y
v
。您需要编写
stuff[k]=v+1
,以使您的代码满足您的需要。

如果您想计算冒险家携带的物品,最好使用
计数器。它们自动从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

如果你想清点冒险家携带的物品,最好使用
计数器。它们自动从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

这是不对的。在循环体的开头,
v
不是一个新对象,它是对与
stuff[k]
相同的
int
的引用。只有在
+=
语句之后,它才会反弹到一个新值(因为
int
是不可变的,不能就地修改)。这是不正确的。在循环体的开头,
v
不是一个新对象,它是对与
stuff[k]
相同的
int
的引用。只有在
+=
语句之后,它才会反弹到一个新值(因为
int
是不可变的,不能在适当的位置修改)。在Python中,前两句话都不是真的。Python的整数是对象,与所有其他对象一样通过引用传递。但是,它们是不可变的,这意味着
+=
返回一个新对象,而不是对同一对象的引用(该对象已被修改)。啊,我把python和java混淆了:-/在python中,您的前两句话都不是真的。Python的整数是对象,通过re传递