Python列表被返回列表的方法损坏

Python列表被返回列表的方法损坏,python,list,Python,List,我是python新手,一直无法找到任何解释我在下面看到的行为的东西。当我从一个方法返回一个列表时,我注意到了这个问题,并将它提炼成显示问题的最简单形式。我找到了一个解决方法,但我想知道我的理解中缺少了什么,因为我希望两个示例的行为相同 class MyCount: """A simple count test to show return list problem""" def __init__(self): self.next = [0] def co

我是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]
>>> 
class MyCount:
“”“显示返回列表问题的简单计数测试”“”
定义初始化(自):
self.next=[0]
def计数良好(自身):
self.next[0]+=1
返回[self.next[0]]
def计数不良(自身):
self.next[0]+=1
return self.next#使用此表单返回会损坏接收列表
c=MyCount()
结果=4*[0]
结果[0]=c.计数良好()
结果[1]=c.计数良好()
结果[2]=c.计数错误()
打印结果
结果[3]=c.计数错误()
打印结果
>>>c=MyCount()
>>>结果=4*[0]
>>>结果[0]=c.计数良好()
>>>结果[1]=c.计数良好()
>>>结果[2]=c.计数错误()
>>>打印结果
[[1], [2], [3], 0]
>>>结果[3]=c.计数错误()
>>>打印结果
[[1], [2], [4], [4]]   >>
>>>c=MyCount()
>>>结果=4*[0]
>>>c.计数良好()
[1]
>>>c.计数良好()
[2]
>>>c.计数错误()
[3]
>>>c.计数错误()>>

当您
返回self.next
时,您返回的是对实际列表对象的引用,
self.next
引用的对象不是副本。因此,从任何地方对原始列表对象所做的任何更改都将反映在引用该原始对象的所有位置

为了返回副本,您应该制作一个完整的切片:

return self.next[:]
或者使用
list()
功能:

return list(self.next)

当您
返回self.next
时,您返回的是对实际列表对象的引用,
self.next
引用的是而不是副本。因此,从任何地方对原始列表对象所做的任何更改都将反映在引用该原始对象的所有位置

为了返回副本,您应该制作一个完整的切片:

return self.next[:]
或者使用
list()
功能:

return list(self.next)