我是python的新手,找不到任何解释我在下面看到的行为的东西。 从方法返回列表时,我注意到了这个问题,并将其提炼为显示问题的最简单的形式。 我想出了一个解决方法,但想知道我的理解中缺少什么,因为我希望这两个示例的行为相同。
class MyCount:
"""A simple count test to show return list problem"""
def __init__(self):
self.next = [0]
def count_good(self):
self.next[0] += 1
return [self.next[0]]
def count_bad(self):
self.next[0] += 1
return self.next # returning using this form corrupts the recieving list
c=MyCount()
result=4*[0]
result[0]=c.count_good()
result[1]=c.count_good()
result[2]=c.count_bad()
print result
result[3]=c.count_bad()
print result
>>> c=MyCount()
>>> result=4*[0]
>>> result[0]=c.count_good()
>>> result[1]=c.count_good()
>>> result[2]=c.count_bad()
>>> print result
[[1], [2], [3], 0]
>>> result[3]=c.count_bad()
>>> print result
[[1], [2], [4], [4]] <--- the return changed the previous item in the list
>>>
>>> c=MyCount()
>>> result=4*[0]
>>> c.count_good()
[1]
>>> c.count_good()
[2]
>>> c.count_bad()
[3]
>>> c.count_bad() <--- seems to work fine when not returning to a list
[4]
>>>
当您return self.next
时,您将返回对self.next
引用的实际列表对象的引用,而不是副本。因此,从任何地方对该原始列表对象所做的任何更改都将反映在引用该原始对象的所有位置中。
为了返回副本,您应该制作一个完整的切片:
return self.next[:]
或使用list()
功能:
return list(self.next)