Python 将列表传递给类中的方法

Python 将列表传递给类中的方法,python,list,class,Python,List,Class,我有以下问题,在详细解释之前,我想先通过显示以下两个最小类来说明: class Example1: def __init__(self): pass def function11(self,x): x=2*x+1 return x def function12(self,x): y=0 z=x while y<z: x=self.functi

我有以下问题,在详细解释之前,我想先通过显示以下两个最小类来说明:

class Example1:

    def __init__(self):
        pass

    def function11(self,x):
        x=2*x+1
        return x

    def function12(self,x):
        y=0
        z=x
        while y<z:
            x=self.function11(x)
            y=y+1
        return x

class Example2:# the only difference to the previous class: it handles 
               #lists instead of numbers

    def __init__(self):
        pass

    def function21(self,x):
        x[0]=2*x[0]+1
    return x

    def function22(self,x):
        y=0
        z=x[0]
        while y<z:
            x=self.function21(x)
            y=y+1
        return x    



if __name__=="__main__":
    A1=Example1()
    x1=A1.function11(3)
    y1=A1.function12(x1)
    print'Result of Example1:'
    print x1
    print y1
    print 

    A2=Example2()
    x2=A2.function21([3])
    y2=A2.function22(x2)
    print'Result of Example2:'
    print x2
    print y2

我不明白的是:为什么变量x2会被y2的值覆盖?这显然取决于列表在Python中是可变对象这一事实,对吗?我在这方面的研究使我找到了一篇作者的文章。尽管如此,我还是不太明白这里发生了什么。

function12
function12
不会改变它们的输入参数(顺便说一句,对于不可变的类型,例如
int
,这是不可能的)。他们只是根据参数计算结果,将名称
x
重新绑定到该计算的值,然后返回该结果

function21
function22
对其输入参数进行变异,然后返回

这就是一切。下面是对输入参数有无副作用的函数的简短演示:

>>> def no_sideeffects(x):
...     return x + [1] # build a new list and return the result, don't touch x
... 
>>> x = [0]
>>> no_sideeffects(x)
[0, 1]
>>> x
[0]
>>> 
>>> def sideeffects(x):
...     x[0] = 23 # mutate x, i.e. change value at index 0
...     return x # then return it
... 
>>> x
[0]
>>> sideeffects(x)
[23]
>>> x
[23]

Example1
Example2
之间的区别在于,您在
Example1
中返回一个值,而在
Example2
中返回一个列表
Example2
返回传递给它的相同列表,因此,当您调用
function22
时,您正在使用相同的列表,因此,它的值会被覆盖。

因为在
Example2.function21
中,您正在传递一个列表对象,并通过其索引对其进行变异(在
x[0]=2*x[0]+1
)。在
Example1.function11
中,您没有改变原始变量(只是通过:
x=2*x+1
将名称重新分配给不同的对象),读取可能会有所帮助
>>> def no_sideeffects(x):
...     return x + [1] # build a new list and return the result, don't touch x
... 
>>> x = [0]
>>> no_sideeffects(x)
[0, 1]
>>> x
[0]
>>> 
>>> def sideeffects(x):
...     x[0] = 23 # mutate x, i.e. change value at index 0
...     return x # then return it
... 
>>> x
[0]
>>> sideeffects(x)
[23]
>>> x
[23]