<p>不幸的是,标准库(或其他著名的库)中没有这样的包装器。主要原因是<code>list</code>应该是一个具有索引访问的<em>可变</em>序列类型。不可变的序列类型应该是<code>tuple</code>,正如您自己所说的那样。所以通常,使列表不可变的标准方法是通过调用<code>tuple(lst)</code>使其成为一个元组。在</p>
<p>这显然不是您想要的,因为您希望避免复制所有元素。因此,您可以创建一个自定义类型来包装列表,并提供所有非修改方法<code>list</code>还支持:</p>
<pre><code>class ImmutableList:
def __init__ (self, actualList):
self.__lst = actualList
def __len__ (self):
return self.__lst.__len__()
def __getitem__ (self, key):
return self.__lst.__getitem__(key)
def __iter__ (self):
return self.__lst.__iter__()
def __reversed__ (self):
return self.__lst.__reversed__()
def __contains__ (self, item):
return self.__lst.__contains__(item)
def __repr__ (self):
return self.__lst.__repr__()
def __str__ (self):
return self.__lst.__str__()
</code></pre>
^{pr2}$
<p>另一种方法是使用子类型<code>list</code>并重写<code>__setitem__</code>和{<cd7>}来引发异常,但我建议不要这样做,因为{<cd1>}的子类型与{<cd1>}本身具有相同的接口。^另一方面,上面的{<cd10>}只是一些可索引的序列类型,它恰好包装了一个真正的列表本身。除此之外,将其作为<code>list</code>的子类型实际上需要您复制一次内容,因此如果您不想重新创建所有这些项,包装肯定会更好(这似乎是您的重点,否则您可以使用<code>tuple</code>)。在</p>