python学习笔记4-函数的默认参数值
经验:一定要仔细看讲义,讲的很清楚。要多次看看啊。
def addList(L=['a']):
L.append('END')
return L
以上调用多次,会出现多个END!!!
以下所有的调用,都正常显示!!
def sst(s="aa"):
s=s + "b"
return s
def ssr(s=""):
s=s + "b"
return s
def num_test(s=1):
s=s+1
return s
def saar(s=''):
s=s + 'b'
return s
总结:
Python函数在定义的时候,默认参数L的值就被计算出来了,即[],因为默认参数L也是一个变量,它指向对象[],每次调用该函数,如果改变了L的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]了。
这个函数defadd_end(L=[]):
L.append('END')
return L
在定义的时候,L的值被指向了对象[],
我们第一次调用函数的时候,>>>add_end()
['END']
因为没有给参数,默认L=[]
就是L的值被指向了对象[],(可以理解为赋值)
定义函数的时候,括号里的不是变量类型,是定义了类型,并赋值了。
而且这赋值只有在第一次引用的时候有用。因为这是可变对象。如果是不变对象,那么第二次引用的时候,继续赋值。
上面这句话尽量不要这样理解。请按照下面理解:
def函数的时候,L已经被分配了内存空间,这才是需要重视的地方。即使你调用再多次,L就是指向一个内存空间。
而String和int不一样,是不变对象,def函数的时候,指向了一个空间。一旦再次调用,马上指向了新的空间,如下图。
总结就是:函数定义默认参数要牢记一点:默认参数必须指向不变对象!
不可变(immutable):int、字符串(string)、float、(数值型number)、元组(tuple)
可变(mutable):字典型(dicti)、列表型(list)
上图中=['a']在第二次调用时已经没有意义了,可以这样理解。L对象已经被建立了。确实没有意义。有意义的是函数定义的一开始。L对象建立。函数定义默认值,首先指出了变量类型,其次指出了默认参数。再理解到函数定义的一开始。默认参数L对象建立。最后理解不可变对象和可变对象。把那几个程序都敲敲,就可以了。
关于测试的时候一些小错误
num和num()的区别,一个是函数调用,一个是函数名
如果直接打函数名,就会出现下面的内容,这是因为返回的是函数num所在的内存地址