gpt4 book ai didi

python 搁置: same objects become different objects after reopening shelve

转载 作者:行者123 更新时间:2023-12-01 08:50:00 27 4
gpt4 key购买 nike

我使用搁置看到了这种行为:

import shelve

my_shelve = shelve.open('/tmp/shelve', writeback=True)
my_shelve['a'] = {'foo': 'bar'}
my_shelve['b'] = my_shelve['a']
id(my_shelve['a']) # 140421814419392
id(my_shelve['b']) # 140421814419392
my_shelve['a']['foo'] = 'Hello'
my_shelve['a']['foo'] # 'Hello'
my_shelve['b']['foo'] # 'Hello'
my_shelve.close()

my_shelve = shelve.open('/tmp/shelve', writeback=True)
id(my_shelve['a']) # 140421774309128
id(my_shelve['b']) # 140421774307832 -> This is weird.
my_shelve['a']['foo'] # 'Hello'
my_shelve['b']['foo'] # 'Hello'
my_shelve['a']['foo'] = 'foo'
my_shelve['a']['foo'] # 'foo'
my_shelve['b']['foo'] # 'Hello'
my_shelve.close()

正如您所看到的,当搁架重新打开时,以前是同一对象的两个对象现在是两个不同的对象。

  1. 有人知道这里发生了什么吗?
  2. 有人知道如何避免这种行为吗?

我使用的是Python 3.7.0

最佳答案

shelve将对象的 pickle 表示存储到架子文件中。当您存储与 my_shelf['a'] 相同的对象时和my_shelf['b'] , shelve'a' 写入对象的 pickle键,以及 'b' 对象的另一个 pickle key 。需要注意的一个关键事项是它单独 pickle 所有值。

当您重新打开书架时,shelve使用 pickle 的表示来重建对象。它使用 pickle 'a'重建您存储的字典,它使用 'b' 的 pickle重新构建您存储的字典再次

pickles 不会相互交互,并且在 unpickled 时没有任何方式返回相同的对象。磁盘上的表示没有表明 my_shelf['a']my_shelf['b']永远都是同一个物体;使用单独的物体制作的架子 my_shelf['a']my_shelf['b']可能看起来相同。

<小时/>

如果您想保留这些对象相同的事实,则不应将它们存储在架子的单独键中。考虑使用 'a' 对单个字典进行 pickle 和取消 pickle 和'b'键而不是使用 shelve .

关于 python 搁置: same objects become different objects after reopening shelve,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53163993/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com