Python make方法不可变

时间:2011-10-08 00:05:42

标签: python

我有以下代码:

class Hello(object):
    def __init__(self, names):
        self.names = names
    def getnames(self):
        return self.names  

if __name__ == "__main__":
    names = ['first', 'middle', 'last']     
    ob = Hello(names)
    a = ob.getnames()
    print a
    a.remove('first')
    print a
    print ob.getnames()

以下是输出:

['first', 'middle', 'last']
['middle', 'last']
['middle', 'last']

是因为方法getnames是可变的吗?或者可能还有其他事情发生在这里。谁能解释一下? 如何让方法返回原始列表?

3 个答案:

答案 0 :(得分:3)

getnames返回副本:

def getnames(self):
    return self.names[:]

答案 1 :(得分:3)

在Python中,赋值永远不会复制数据结构。它只使名称引用一个值。此外,函数调用实质上是为参数名称赋予实际参数。因此,代码中不会复制任何内容。名称aob.names引用相同的列表。如果您想要两个列表副本(原始副本和一个要修改的副本),那么您需要在某个时刻制作副本。你必须决定最有意义的地方。

您可以通过几种不同的方式复制列表:list(L)L[:]是最常用的方式。

答案 2 :(得分:0)

名称a指的是ob.names中存储的相同数组。如果您更改a,则更改ob.names,因为它们都指的是相同的内容。