Pythonが参照を保持する方法と可変性を混同していると思います-考慮してください:
class Foo(object):
pass
t = (1,2,Foo()) # t is a tuple, :. t is immutable
b = a[2] # b is an instance of Foo
b.foo = "Hello" # b is mutable. (I just changed it)
print (hash(b)) # b is hashable -- although the default hash isn't very useful
d = {b : 3} # since b is hashable, it can be used as a key in a dictionary (or set).
c = t # even though t is immutable, we can create multiple references to it.
a = [t] # here we add another reference to t in a list.
エンジンのリストをグローバルに取得/保存することについての質問です。これを行うにはいくつかの方法があります。
class Engine(object):
def __init__(self, make, model):
self.make = make
self.model = model
class EngineFactory(object):
def __init__(self,**kwargs):
self._engines = kwargs
def all_engines(self):
return self._engines.values()
def __call__(self,make, model):
""" Return the same object every for each make,model combination requested """
if (make,model) in _engines:
return self._engines[(make,model)]
else:
a = self._engines[(make,model)] = Engine(make,model)
return a
engine_factory = EngineFactory()
engine1 = engine_factory('cool_engine',1.0)
engine2 = engine_factory('cool_engine',1.0)
engine1 is engine2 #True !!! They're the same engine. Changing engine1 changes engine2
EngineFactory._engines
上記の例は、オブジェクトへの実際の参照を実際に格納する代わりに、辞書weakref.ref
にオブジェクトを格納させることで少し改善できます。その場合、オブジェクトへの新しい参照を返す前に、参照がまだ生きている (ガベージ コレクションされていない) ことを確認します。