搁置对象和python字典

时间:2014-07-18 08:09:42

标签: python dictionary shelve

我不确定这是搁置物体的错误, 但它仍然是很奇怪的行为。 如果将一个字典对象存储在搁置对象中,则似乎无法轻松修改关联的字典。 这是一个用于演示的python代码:

>>> import shelve
>>> d=shelve.open('test')
>>> d['test'] = {'test1':'A' }
>>> print d['test']['test1']
A
>>> d['test']['test1'] = 'C'
>>> print d['test']['test1']
A # !!! odd
>>> d['test'] = {'test1':'A' }
>>> d1 = d['test']
>>> d1['test1'] = 'C'
>>> print d1
{'test1': 'C'}
>>> d['test']= d1
>>> print d['test']['test1']
C
>>> d['test'] = {'test1':'A' }
>>> d['test'] = {'test1':'C' }
>>> print d['test']['test1']
C

python中搁置对象的正常行为是什么?

2 个答案:

答案 0 :(得分:2)

从文档中

      d[key] = data   # store data at key (overwrites old data if
                      # using an existing key)

      data = d[key]   # retrieve a COPY of the data at key (raise
                      # KeyError if no such key) -- NOTE that this
                      # access returns a *copy* of the entry!

因此,在您的代码中,d['test']= d1将修改原始数据,但d['test']['test1'] = 'C'将修改新复制的对象。使用d = shelve.open('test', writeback=True)修改此默认值并查看文档以获取更多详细信息。

答案 1 :(得分:0)

希望更好的解释

Python shelve模块是键/值商店。

这实质上意味着它就像一个Python字典 (它做什么)。但是当你这样做时:

from shelve import open

d = open("test.db")
d["a"] = {"b": 1}

您正在存储以下内容:

  • key:"a"
  • 值:{"b": 1}

然后您在“商店”询问密钥a 你马上回到价值{"b": 1} 现在是一个新的对象引用(dict) 在记忆中。

所以以下内容不会存储或制作任何内容 更改存储在商店中的值:

d["a"]["b"] = 2

这只会改变“内存中” 你引用的dict {"b": 1} 隐式。

在密钥{"b": 1}中存储a的新值 您必须“明确”为a设置一个新密钥,如下所示:

d["a"] = {"b": 2}