当定义函数时,会保存函数中默认参数 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中没有传

本文深入探讨了Python中函数默认参数的实现机制,特别是当默认参数为可变类型如列表时,多次调用函数可能产生的意外结果。通过具体示例,解析了如何避免这些陷阱,确保函数行为符合预期。
最低0.47元/天 解锁文章
14万+





