我有以下问题,我想通过在详细解释之前先显示以下两个最小类来说明这些问题:
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
这是输出:
Result of Example1:
7
1023
Result of Example2:
[1023]
[1023]
>>>
我在这里不明白:为什么变量x2会被y2的值覆盖?它显然取决于列表是Python中的可变对象的事实,我是对的吗?我对此的搜索使我得到了Effbot的一篇文章。不过,我真的不明白这里发生了什么。
答案 0 :(得分:1)
function12
和function12
不会改变它们的输入参数(顺便说一下,对于int
等不可变类型来说,这是不可能的。他们只是根据参数计算结果,将名称x
重新绑定到该计算的值,然后返回该结果。
function21
和function22
mutate 输入参数,然后将其返回。
真的就是这一切。这是对输入参数有或没有副作用的函数的简短演示:
>>> 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]
答案 1 :(得分:0)
Example1
和Example2
之间的区别在于,您要在Example1
中返回一个值,而在Example2
中返回列表。
Example2
会返回传递给它的相同列表,因此,当您致电function22
时,您重新使用相同的列表,因此,它的价值被覆盖了。