在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)