我有以下代码:
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是可变的吗?或者可能还有其他事情发生在这里。谁能解释一下? 如何让方法返回原始列表?
答案 0 :(得分:3)
让getnames
返回副本:
def getnames(self):
return self.names[:]
答案 1 :(得分:3)
在Python中,赋值永远不会复制数据结构。它只使名称引用一个值。此外,函数调用实质上是为参数名称赋予实际参数。因此,代码中不会复制任何内容。名称a
和ob.names
引用相同的列表。如果您想要两个列表副本(原始副本和一个要修改的副本),那么您需要在某个时刻制作副本。你必须决定最有意义的地方。
您可以通过几种不同的方式复制列表:list(L)
或L[:]
是最常用的方式。
答案 2 :(得分:0)
名称a
指的是ob.names
中存储的相同数组。如果您更改a
,则更改ob.names
,因为它们都指的是相同的内容。