我目前正在网上学习Python编程课程,我们正在学习搁置模块。这位教授已经证明,出于某种原因,架子无法知道可变对象何时发生了这样的变化:(他也解释了相关的方法)
import shelve
# Making a bunch of lists to bind to shelves later
blt = ["bacon", "tomato", "lettuce", "bread"]
beans_on_toast = ["beans", "bread"]
scrambled_eggs = ["eggs", "butter", "milk"]
soup = ["tin of soup"]
pasta = ["pasta", "cheese"]
with shelve.open('recipes') as recipes:
# Binding each list to a shelve
recipes['blt'] = blt
recipes['beans on toast'] = beans_on_toast
recipes['scrambled eggs'] = scrambled_eggs
recipes['pasta'] = pasta
recipes['soup'] = soup
# Attempting to append 'butter' and 'tomato' to respective lists
recipes['blt'].append("butter")
recipes['pasta'].append("tomato")
for snack in recipes:
print(snack, recipes[snack])
for循环的输出显示,货架保持不变,“butter”和“tomato”的值没有附加到各自的货架上
我的在线教授试图解释为什么会这样,但我很难理解。如果有人能给我解释一下,我将不胜感激
如果你有耐心的话,你能解释一下你在回答中可能用到的,你认为我不会理解的术语吗。我还是个初学者,Python是我学习的第一门语言。提前谢谢
把你的
recipes
书架想象成厨房里的一本物理食谱书recipes['blt'] = blt
在书中写了一个制作类似blt
的菜肴的食谱访问
recipes['blt']
根据食谱制作一道菜recipes['blt'].append("butter")
做一道菜,然后加黄油。书中的食谱并没有突然涉及黄油;如果你想重写食谱,你就必须单独做这就是
shelve
的基本工作原理。磁盘上的数据文件支持Shelf
对象,文件中的每个条目都包含用于构建对象的指令(采用pickle格式)。访问工具架会根据存储的指令生成对象,但更改生成的对象不会更改指令如果使用
writeback=True
创建工具架,则工具架将缓存生成的对象,并在再次访问同一条目时返回同一对象,而不是在每次访问条目时构建新对象。它仍然不知道您何时更改任何内容,但由于它返回相同的对象,因此更改仍然存在关闭
writeback=True
工具架时,工具架将在关闭时为对象写入新的pickle。新的pickle将反映对对象的任何更改。这可能涉及大量不必要的书写,因为工具架仍然不知道您何时更改了对象,因此它必须重新对所有对象进行pickle,即使是未更改的对象相关问题 更多 >
编程相关推荐