使python列表保持不变且不可编辑

时间:2015-08-27 15:50:40

标签: python constants

我有一个代码:

def constant(f):
    def fset(self, value):
        raise SyntaxError( "You can't change a constant!" )
    def fget(self):
        return f(self)
    return property(fget, fset)

class A( object ):
    def __init__( self, a_list ):
        super( A, self ).__init__()
        self.__data = a_list[:]
    @constant
    def data( self ):
        return self.__data

我想让自我.__数据可访问,但不可更改且无法从课堂外进行。我不能简单地将它改为元组,因为我希望它能够很容易地改变类中的方法。当有人修改列表时,我上面提到的解决方案不起作用:

>>> a = A( range(5) )
>>> a.data = []
Traceback (most recent call last):
    ...
SyntaxError: You can't change a constant! # it works
>>> a.data[0]=6                           # it doesn't work
>>> a.data
[6, 1, 2, 3, 4]

你知道我的问题有什么好办法吗?

2 个答案:

答案 0 :(得分:1)

提供一些不应该更改的提示,但如果他们真的需要,可以让人们进行更改。

如果您希望不可修改list使用tuple。使用前导下划线来获得额外的"安全"。

总有办法在Python中更改 list 。即使我不得不闯入你的房子,窃取你的代码然后改变它 - 它是可能的。

_change_this_and_I_will_kill_you_with_my_axe = [] # never use this name

如果你是。退货清单并且不希望修改退货复印件,但 仍然可以修改它。

return my_list[:]

答案 1 :(得分:1)

您还可以创建一个实现列表所有读取操作的View类。当然,仍然有办法访问内部列表,没有办法阻止它。

class ListView(object):
  def __init__(self, list_):
    self._list = list_
  def __getitem__(self, index):
    return self._list[index]
  def __repr__(self):
    return 'ListView(%r)' % self._list
  def index(self, value):
    return self._list.index(value)
  # and so on

(从移动设备发送)