Python中的不可变列表

ora*_*nge 4 python tuples list immutability

我正在尝试创建一个在整个应用程序中使用的列表.我认为将这个列表包装在一个元组中可以解决这个问题,但它似乎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)
Run Code Online (Sandbox Code Playgroud)

是否有一种简单的方法可以在此列表上创建一个列表支持的"视图",该视图是不可变的(此视图上的操作),但是反映了支持列表中发生的任何更改?

我意识到之前已经问过这个问题,但没有一个回复解决这个视图支持列表关系(实际上一些评论甚至表明元组按照我希望的方式工作,但上面的代码片段暗示了其他情况).

jsb*_*eno 8

如果您不想复制数据,并希望传递不可更改的"列表",一种方法是创建代理对象,列表副本,禁用所有更改方法,并参考读取方法到原始列表 - 一些东西:

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
Run Code Online (Sandbox Code Playgroud)

当然,实现您认为必要的其他任何方法,或者提出错误(或忽略写入指令) - 或者访问内部列表中的相应对象.

  • OP希望通过我对该问题的理解,在其他环境中不断更改原始列表.因此,根据定义它是不可取的.如果想要一个包含内容列表的momment快照的哈希,解决方案是创建一个哈希值,暂时创建一个元组并选择该哈希值,并在调用`__hash__`时返回该值. (2认同)