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:我已经更新了答案,并解释了如何修改搁置中的项目。谢谢。这正是我最终要做的。