方法形参里有空列表可能会导致哪些问题?N年前楼主第一次被问到这个问题直接懵逼,因为确实没有关注过这个东西。查过资料后才知道这里面确实有坑。
talk is cheap ,我们通过一个例子一看便知。
def emptyList(num, li=[]):
print(id(li))
for i in range(num):
li.append(i)
print(li)
if __name__ == '__main__':
emptyList(5)
emptyList(8)
按照直观的猜想,li的打印结果应该是:
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 5, 6, 7]
实际li的打印结果却是:
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 5, 6, 7]
这是因为:如果调用方法时,形参中的列表如果没有传值,方法中不会给这个列表参数重新赋空值,而是依旧使用形参列表这个参数。
注意看两次打印的li的ID值都是一样的,都是66048328。
那如何解决这种问题呢?
加上li是否空值的判断,如果是空值,就再次给赋个值[]
def emptyList(num, li=[]):
if not li: #意思是如果没有传li
li = []
print(id(li))
for i in range(num):
li.append(i)
print(li)
if __name__ == '__main__':
emptyList(5)
emptyList(8)
#结果 不再有之前的数据,地址相同
3760776
[0, 1, 2, 3, 4]
3760776
[0, 1, 2, 3, 4, 5, 6, 7]
另一种条件
def emptyList(num, li=[]):
# **************************************
if li: #如果li不是空的,重新复制为空 li的地址会不一样
li = []
# **************************************
print(id(li))
for i in range(num):
li.append(i)
print(li)
if __name__ == '__main__':
emptyList(5)
emptyList(8)
#结果 地址不一样
33776200
[0, 1, 2, 3, 4]
33776264
[0, 1, 2, 3, 4, 5, 6, 7]