在Python中向键追加值?

在Python中向键追加值?,python,append,shelve,pickle,Python,Append,Shelve,Pickle,如果这个特定的玩家已经有了分数,我想把新的分数附加到他已有的分数上,但显然这不起作用,因为它根本不会改变他的分数。工具架对象不会检测到你工具架中可变对象的变化。它只检测分配 要解决此问题,请使用writeback=True打开工具架,并确保完成后关闭。(您也可以每隔一段时间进行同步,以降低缓存的内存使用率。) 相关文件来自: 由于Python语义的原因,工具架无法知道何时 永久字典条目已修改。默认情况下,修改的对象 仅在分配给工具架时写入(参见示例)。如果 可选的writeback参数设置为Tr

如果这个特定的玩家已经有了分数,我想把新的分数附加到他已有的分数上,但显然这不起作用,因为它根本不会改变他的分数。

工具架对象不会检测到你工具架中可变对象的变化。它只检测分配

要解决此问题,请使用
writeback=True打开工具架,并确保完成后
关闭。(您也可以每隔一段时间进行
同步
,以降低缓存的内存使用率。)

相关文件来自:

由于Python语义的原因,工具架无法知道何时 永久字典条目已修改。默认情况下,修改的对象 仅在分配给工具架时写入(参见示例)。如果 可选的
writeback
参数设置为
True
,访问所有条目 也缓存在内存中,并在
sync()
close()
上写回;这 可以更方便地在持久性数据库中变异可变条目 但是,如果访问了许多条目,它可能会消耗大量资源 缓存的内存量,它可以执行关闭操作 非常慢,因为所有访问的条目都被写回(没有办法 确定哪些访问的条目是可变的,哪些是可变的 实际上发生了变异)

请注意,您可以使用
writeback=True
跳过打开以节省内存,但您的代码将更加详细,如
shelve
文档中所示

if savescores == "y":
        name = raw_input("Enter your name.")
        datfile = filename[0:-4] + ".dat"
        highscores = shelve.open(datfile)
        try:
            highscores[name].append(score)
        except:
            highscores[name] = [score]
顺便说一下,这个代码

# as d was opened WITHOUT writeback=True, beware:
d['xx'] = [0, 1, 2]    # this works as expected, but...
d['xx'].append(3)      # *this doesn't!* -- d['xx'] is STILL [0, 1, 2]!

# having opened d without writeback=True, you need to code carefully:
temp = d['xx']      # extracts the copy
temp.append(5)      # mutates the copy
d['xx'] = temp      # stores the copy right back, to persist it

# or, d=shelve.open(filename,writeback=True) would let you just code
# d['xx'].append(5) and have it work as expected, BUT it would also
# consume more memory and make the d.close() operation slower.

d.close()       # close it
更简洁地表达为

try:
    highscores[name].append(score)
except:
    highscores[name] = [score]

你能更详细地解释一下什么不起作用吗?你所拥有的第一眼看上去还行(尽管我会做
除了keyrerror
而不是简单的
除了
)。它是“try:highscores[name].append(score)”。当我要求它打印特定玩家的分数时,没有任何变化,只是我以前得到的分数,而它应该将旧分数和新分数放在列表中。@Shashank:你的意思是
setdefault
而不是
get
get
不会对字典进行变异,
setdefault
会对字典进行变异。查看
d={}的结果;d、 获取('x',[])。追加(1);打印(d)
@StevenRumbalski是我的错<代码>高分。设置默认值('name',[])。追加(分数)
highscores.setdefault(name, []).append(score)