当定义函数时,会保存函数中默认参数 list 的值,也就是列表 l=[];
在每次调用的时候如果传递了新的列表,则使用传递的列表,没有传递,使用定义函数时保存的默认参数(l=[]);
在调用中没有传递新的列表(使用默认列表 l=[] )的时候,程序会调用定义函数时保存的默认参数((l=[]));
列表在append的时候会在 l=[] 原来的基础上append追加值,所以会产生以下结果.
# *===================================*
# -*- coding: utf-8 -*-
# * Time : 2019-07-03 10:50
# * Author : zhangsf
# *===================================*
def f(x,l=[]):
print(id(l))
for i in range (x):
l.append(i*i)
print(l)
print('---1---')
f(2)
print('---2---')
f(3,[3,2,1])
print('---3---')
f(4,[])
print('---4---')
f(2)
---1---
4384243592
[0, 1]
---2---
4384954248
[3, 2, 1, 0, 1, 4]
---3---
4384954248
[0, 1, 4, 9]
---4---
4384243592
[0, 1, 0, 1]
Process finished with exit code 0
上面通过打印可以发现
会发现l[]的ID值在1、4中是相同的,2、3中是相同的;
说明两次执行时使用的都是定义函数时的默认参数 l=[ ]
当3中传递空列表时,函数体当中会使用传递的空列表,4中没有传递时,使用函数默认值 l=[ ], 所以会产生以上结果。
如果想无论都不影响的时候只需要在传入l[]的时候判断即可
if not l:
# 如果l不为空的话,就往下走(清空列表); 为空就不走
l = []