我试图创建一个在整个应用程序中使用的列表是不可变的。我认为将这个列表包装在一个元组中就可以了,但似乎tuple(list)
实际上并没有包装,而是复制了列表元素。
>>> a = [1, 2, 3, 4]
>>> b = tuple(a)
>>> b
(1, 2, 3, 4)
>>> a[0] = 2
>>> b # was hoping b[0] to be 2
(1, 2, 3, 4)
是否有一种简单的方法可以创建列表支持的"视图"在此列表上是不可变的(此视图上的操作),但反映了支持列表中发生的任何更改?
我意识到之前已经问过这个问题,但没有一个回复解决这个视图支持列表关系(实际上一些评论甚至表明元组按照我希望的方式工作,但上面的代码段建议否则)。
答案 0 :(得分:7)
如果您不想复制数据,并希望传递一个不可更改的列表"周围,一种方法是创建一个代理对象,一个列表的副本,它禁用所有更改的方法,并将阅读方法引用到原始列表 - 这是:
class ReadOnlyList(list):
def __init__(self, other):
self._list = other
def __getitem__(self, index):
return self._list[index]
def __iter__(self):
return iter(self._list)
def __slice__(self, *args, **kw):
return self._list.__slice__(*args, **kw)
def __repr__(self):
return repr(self._list)
def __len__(self):
return len(self._list)
def NotImplemented(self, *args, **kw):
raise ValueError("Read Only list proxy")
append = pop = __setitem__ = __setslice__ = __delitem__ = NotImplemented
当然,实现你认为必要的其他任何方法,要么提出错误(或忽略写入指令) - 要么接受内部列表中的相应对象。