Python 试图在货架上存放德克的奇怪行为
我将让下面的终端会话自己说话:Python 试图在货架上存放德克的奇怪行为,python,shelve,Python,Shelve,我将让下面的终端会话自己说话: >>> import shelve >>> s = shelve.open('TestShelve') >>> from collections import deque >>> s['store'] = deque() >>> d = s['store'] >>> print s['store'] deque([]) >>> print
>>> import shelve
>>> s = shelve.open('TestShelve')
>>> from collections import deque
>>> s['store'] = deque()
>>> d = s['store']
>>> print s['store']
deque([])
>>> print d
deque([])
>>> s['store'].appendleft('Teststr')
>>> d.appendleft('Teststr')
>>> print s['store']
deque([])
>>> print d
deque(['Teststr'])
d
和s['store']
不应该指向同一个对象吗?为什么appendleft
在d
上工作,而不是在s['store']
上工作?结果是它们不一样,所以对它们执行的任何操作都不匹配:
>>> import shelve
>>> s = shelve.open('TestShelve')
>>> from collections import deque
>>> s['store'] = deque()
>>> d = s['store']
>>> id(s['store'])
27439296
>>> id(d)
27439184
要在编码时修改项目,需要传递参数writeback=True
:
s = shelve.open('TestShelve', writeback=True)
请参阅文档:
如果writeback参数为True,则该对象将保留
在同步和关闭时,访问所有条目并将其写回dict
时代。这允许对可变条目进行自然操作,但可以
消耗更多内存,使同步和关闭花费很长时间
您也可以使用writeback=False
执行此操作,但是您需要完全按照提供的示例编写代码:
# 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
shelve
是pickle
ing(序列化)对象。当然,这是复制品。因此,您从shelve
中获取的对象不会与您放入的对象具有相同的标识,尽管它们是等效的
如果这很重要,您可以编写一个
deque
子类,每当它被修改时自动重新上架,尽管在许多用例中这可能会有很差的性能。因此将变量分配给上架的条目会自动创建一个副本。为什么我不能附加到搁置中存储的deque?@dpitch40:我已经更新了答案,并解释了如何修改搁置中的项目。谢谢。这正是我最终要做的。