为什么shelve不知道何时对可变对象进行了更改?

2024-05-19 03:02:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在网上学习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是我学习的第一门语言。提前谢谢


1条回答
网友
1楼 · 发布于 2024-05-19 03:02:59

把你的recipes书架想象成厨房里的一本物理食谱书

recipes['blt'] = blt在书中写了一个制作类似blt的菜肴的食谱

访问recipes['blt']根据食谱制作一道菜

recipes['blt'].append("butter")做一道菜,然后加黄油。书中的食谱并没有突然涉及黄油;如果你想重写食谱,你就必须单独做


这就是shelve的基本工作原理。磁盘上的数据文件支持Shelf对象,文件中的每个条目都包含用于构建对象的指令(采用pickle格式)。访问工具架会根据存储的指令生成对象,但更改生成的对象不会更改指令

如果使用writeback=True创建工具架,则工具架将缓存生成的对象,并在再次访问同一条目时返回同一对象,而不是在每次访问条目时构建新对象。它仍然不知道您何时更改任何内容,但由于它返回相同的对象,因此更改仍然存在

关闭writeback=True工具架时,工具架将在关闭时为对象写入新的pickle。新的pickle将反映对对象的任何更改。这可能涉及大量不必要的书写,因为工具架仍然不知道您何时更改了对象,因此它必须重新对所有对象进行pickle,即使是未更改的对象

相关问题 更多 >

    热门问题