我不确定这是搁置物体的错误, 但它仍然是很奇怪的行为。 如果将一个字典对象存储在搁置对象中,则似乎无法轻松修改关联的字典。 这是一个用于演示的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中搁置对象的正常行为是什么?
答案 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}
您正在存储以下内容:
"a"
{"b": 1}
然后您在“商店”询问密钥a
你马上回到价值{"b": 1}
现在是一个新的对象引用(dict
)
在记忆中。
所以以下内容不会存储或制作任何内容 更改存储在商店中的值:
d["a"]["b"] = 2
这只会改变“内存中”
你引用的dict {"b": 1}
隐式。
在密钥{"b": 1}
中存储a
的新值
您必须“明确”为a
设置一个新密钥,如下所示:
d["a"] = {"b": 2}