猿问

关于python 的shelve模块,求大侠

#source1 
#from <python基础教程> 
import shelve 
s = shelve.open('temp.dat') 
s['x'] = ['a', 'b', 'c'] 
s['x'].append('d') 
print s['x'] 
-------------------------- 
>>>['a', 'b', 'c'] 
书上的解释:1.列表['a', 'b', 'c']存储在x下; 
                      2.获得存储的表示, 并且根据它创建新的列表,而'd'加到这个副本.修改的版本还没有被保存! 
                      3.最终,再次获得原始版本----没有'd' 
第2条没想明白,为什么会创建新的列表.(source3中为什么没创建,或者说为什么与source3的结果不一样.) 
======================== 
#source2 
import shelves = shelve.open('temp.dat')s['x'] = ['a', 'b', 'c'] 
s. close() 
s = shelve.open('temp.dat') 
s['x'].append('d')print s['x'] 
-------------------------- 
>>>['a', 'b', 'c'] 
这条是看到别的大神有说是因为s['x'] = ['a', 'b', 'c']这条执行完后没有写回, 
s. close()是确保其结果写回.那s['x'].append('d')结果为什么还是和source1一样. 
======================= 
#source3 
s =  {} 
s['x'] = ['a', 'b', 'c'] 
s['x'].append('d') 
print s['x'] 
------------------------- 
>>>['a', 'b', 'c', 'd']

拉风的咖菲猫
浏览 426回答 2
2回答

牧羊人nacy

文档:Normally, d[key] returns a COPY of the entry.&nbsp; This needs care when&nbsp;mutable entries are mutated: for example, if d[key] is a list,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d[key].append(anitem)&nbsp;does NOT modify the entry d[key] itself, as stored in the persistent&nbsp;mapping -- it only modifies the copy, which is then immediately&nbsp;discarded, so that the append has NO effect whatsoever.&nbsp; To append an&nbsp;item to d[key] in a way that will affect the persistent mapping, use:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data = d[key]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data.append(anitem)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d[key] = data

潇潇雨雨

>>> import shelve&nbsp;>>> help(shelve)
随时随地看视频慕课网APP
我要回答