首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访问字典与访问书架

访问字典与访问书架
EN

Stack Overflow用户
提问于 2010-08-05 05:11:32
回答 2查看 1.4K关注 0票数 1

目前,我有一个字典,它的键是number,值是Class。我可以像这样访问该类的属性:

代码语言:javascript
复制
dictionary[str(instantiated_class_id_number)].attribute1

由于内存问题,我想使用shelve模块。我想知道这样做是否可行。搁置字典的行为是否与标准字典完全相同?如果不是,有什么不同?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-08-05 05:40:26

Shelve的行为与字典不完全相同,特别是在修改字典中已经存在的对象时。

不同之处在于,当您将一个类添加到字典中时,会存储一个引用,但shelve会保留该对象的一个已筛选(序列化)的副本。如果您随后修改该对象,则将修改内存中的副本,但不会修改已腌制的版本。这可以(主要)由写出条目的shelf.sync()shelf.close()透明地处理。完成所有这些工作需要跟踪所有检索到的对象,这些对象还没有被写回,所以您必须调用shelf.sync()来清除缓存。

shelf.sync()清除缓存的问题是,您可以保留对对象的引用,然后再次修改它。

这段代码不能像预期的那样在工具架上工作,但可以在字典上工作:

代码语言:javascript
复制
s["foo"] = MyClass()
s["foo"].X = 8 
p = s["foo"] # store a reference to the object
p.X = 9 # update the reference
s.sync() # flushes the cache
p.X = 0
print "value in memory: %d" % p.X # prints 0
print "value in shelf: %d" % s["foo"].X # prints 9

Sync刷新缓存,因此修改后的'p‘对象将从缓存中丢失,因此不会被写回。

票数 3
EN

Stack Overflow用户

发布于 2010-08-05 05:27:34

是的,它是plausible

工具架对象支持字典支持的所有方法。这简化了从基于字典的脚本到需要持久存储的脚本的过渡。

您需要经常调用shelf.sync()来清除缓存。

编辑

当心,这不完全是dict。例如,参见Laurion的答案。

哦,你只能有str钥匙。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3409856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档