<p>我认为您将易变性与python保存引用的方式混淆了——考虑一下:</p>
<pre><code>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.
</code></pre>
<p>现在,关于获取/存储全局引擎列表的问题--有几种不同的方法可以做到这一点,下面是一种:</p>
<pre><code>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
</code></pre>
<p>通过使用<code>EngineFactory._engines</code>dict store<code>weakref.ref</code>对象而不是实际存储对对象的实际引用,可以稍微改进上面的示例。在这种情况下,在返回对该对象的新引用之前,您需要检查以确保引用仍然有效(没有被垃圾回收)。</p>