廖雪峰python教程的第一个疑问
函数的参数一节中提到:
def add_end(L = []);
L.append('END')
return L
正常调用add_end时(也就是有参数传入时):
>>> add_end([1, 2, 3])
[1, 2, 3, 'END']
>>> add_end(['x', 'y', 'z'])
['x', 'y', 'z', 'END']
当使用默认参数时:
>>> add_end() ['END']
>>> add_end()
['END', 'END']
>>> add_end()
['END', 'END', 'END']
廖雪峰解释如下:
Python函数在定义的时候,默认参数L
的值就被计算出来了,即[]
,因为默认参数L
也是一个变量,它指向对象[]
,每次调用该函数,如果改变了L
的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]
了。
我的理解如下:
第一行,传入参数[1,2,3],接下来的代码都是针对[1,2,3] 的,跟L = [] 没有关系,第三行和第一行一样,这两次都没涉及到L = [] ,所以L的值不变。第二行没有传入参数,所以接下来的代码是针对L了,由[]变成了['END'],第四行还是针对L,但L的值已经变成了['END'],又运行一次,所以就变成了['END','END'] 。
改进的方式如下:
def add_end(L=None): if L is None: L = [] L.append('END') return L
>>> add_end() ['END'] >>> add_end() ['END']
但是我对if L is None : L = [] 这一句还不理解,希望后续能明白吧。