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]