经典面试题-python函数之默认参数
1、可变的默认参数----list
示例:
def add(a, mylist=[]): # print(id(mylist)) mylist.append(a) return mylist print(add(5)) print(add(6)) print(add(6, ["0908"])) print(add(7))
输出结果:
预期输出 | 实际输出 |
[5] [6] ['6', 9008] [ 7] |
[5] [5, 6] ['0908', 6] [5, 6, 7] |
查看其id
def add(a, mylist=[]): print("mylist_id=",id(mylist)) mylist.append(a) return mylist print("mylist=",add(5)) print("mylist=",add(6)) print("mylist=",add(6, ["0908"])) print("mylist=",add(7))
output
mylist_id= 51050248 mylist= [5] mylist_id= 51050248 mylist= [5, 6] mylist_id= 51026632 mylist= ['0908', 6] mylist_id= 51050248 mylist= [5, 6, 7]
从输出结果可以看出,在第1,2,4次调用时,mylist的内存地址是不变的,mylist是列表属于可变对象,对其进行操作时,不会重新分配地址,append函数是将元素添加到列表的最后面,所以每次输出时将新的参数添加到列表的最后面
第3次调用时,mylist的内存地址改变,重新创建对象,所以将默认参数先赋值,然后再将6添加到列表中
优化
def add(a, mylist=[]): if mylist is not None:#将列表清空 mylist=[] print("mylist_id=",id(mylist)) mylist.append(a) return mylist print("mylist=",add(5)) print("mylist=",add(6)) print("mylist=",add(6, ["0908"])) print("mylist=",add(7))
output
mylist_id= 56728264 mylist= [5] mylist_id= 56728264 mylist= [6] mylist_id= 56753928 mylist= [6] mylist_id= 56753928 mylist= [7]