2

次のターミナルセッションでそれ自体を語らせます。

>>> import shelve
>>> s = shelve.open('TestShelve')
>>> from collections import deque
>>> s['store'] = deque()
>>> d = s['store']
>>> print s['store']
deque([])
>>> print d
deque([])
>>> s['store'].appendleft('Teststr')
>>> d.appendleft('Teststr')
>>> print s['store']
deque([])
>>> print d
deque(['Teststr'])

d同じオブジェクトをs['store']指すべきではありませんか?なぜ動作appendleftするのに動作しdないのs['store']ですか?

4

2 に答える 2

3

shelveオブジェクトをpickleing (シリアライズ) しています。必然的に、これはコピーを作成します。したがって、返されるオブジェクトは、入力したオブジェクトとshelve同じ ID を持ちませんが、それらは同等になります。

重要な場合は、deque変更されるたびに自動的に再シェルフするサブクラスを作成できますが、これは多くのユース ケースでパフォーマンスが低下する可能性があります。

于 2012-06-21T20:15:08.903 に答える
2

それらは同じではないことが判明したため、それらに対して実行する操作は一致しません。

>>> import shelve
>>> s = shelve.open('TestShelve')
>>> from collections import deque
>>> s['store'] = deque()
>>> d = s['store']
>>> id(s['store'])
27439296
>>> id(d)
27439184

writeback=Trueコーディングしたとおりに項目を変更するには、パラメーターを渡す必要があります。

s = shelve.open('TestShelve', writeback=True)

ドキュメントを参照してください。

writeback パラメーターが True の場合、オブジェクトはアクセスされたすべてのエントリのキャッシュを保持し、同期およびクローズ時にそれらを dict に書き戻します。これにより、変更可能なエントリに対する自然な操作が可能になりますが、より多くのメモリを消費し、同期とクローズに時間がかかる可能性があります。

で行うこともできwriteback=Falseますが、提供されている例とまったく同じようにコードを記述する必要があります。

# having opened d without writeback=True, you need to code carefully:
temp = d['xx']      # extracts the copy
temp.append(5)      # mutates the copy
d['xx'] = temp      # stores the copy right back, to persist it
于 2012-06-21T20:14:12.830 に答える