问个问题(不知道怎么描述,所以看内容吧)

问个问题(不知道怎么描述,所以看内容吧)



[Copy to clipboard] [ - ]
CODE:
def funa(x=[1]):
    x[0]+=1
    print x[0]

def funb(y=1):
    y+=1
    print y

funa()
funa()
funa()
#
funb()
funb()
funb()

最终结果就是,调用三funa呈现递增,这是为什么呢?在调用funa的时候x=[1]不会使x[0]初始化成为1吗?不太理解,麻烦解释一下,最好两个函数都对比一下,谢谢
>>> def funa(x=[1]):
...     x=x[:]
...     x[0]+=1
...     print x[0]
...
>>> funa()
2
>>> funa()
2
>>> funa()
2

因为list是mutable, 参数中用list,传递的是reference. 在Learning Python 函数的参数部分(p208)专门讲了。
我的理解是:你传的参数是list是可变的,也就是《Learing Python》中说的"mutable objects can be changed in place in the function"的意思.每次将list类型的x传给funa,每次都会对他产生影响.当然第一次改变成2,第二次传递的实际就成了x=[2](因为你用funa(),默认参数为x=[2]),所以是3,而第3次调用结果就变为4了.

[Copy to clipboard] [ - ]
CODE:
>> def funa(x=[1]):
        x[0]+=1
        print x[0]

>>> funa()
2
>>> funa()
3
>>> funa()
4
>>> funa(x=[1])
2

由于参数是int,属于immutable,funb不能影响到它,所以就不会出现funa的递增了.

这个问题还是不是太清楚