(转)python中函数参数中如果带有默认参数list的特殊情况

Python函数默认参数陷阱
本文深入探讨了Python中函数默认参数使用list时的常见错误,解释了为何多次调用函数时,list会累积元素,而非预期地重新初始化。通过代码示例展示了如何正确设置默认参数避免这一问题,提供了解决方案。

在python中函数参数中如果带有默认参数list遇到问题

先看一段代码

1
2
3
4
5
6
7
8
9
def f(x,l=[]):
    for in range(x):
        l.append(i*i)
    print(l)
 
print('---1---')
f(4)
print('---2---')
f(5)

执行结果:

1
2
3
4
---1---
[0149]
---2---
[0149014916]

预期的结果为:

1
2
3
4
---1---
[0149]
---2---
[014916]

问题解释:当定义函数时,会保存函数中默认参数list的值,也就是列表[],在每次调用的时候如果传递了列表,则使用传递的列表,没有传递,使用定义函数时保存的默认参数list,以上案例中两次调用都没有传递默认参数list,程序会调用定义函数时,保存的默认参数list,列表在append的时候回在原来的基础上添加,所以会产生以上结果,我们可以通过打印id看出。

修改代码:

1
2
3
4
5
6
7
8
9
10
11
def f(x,l=[]):
    print(id(l))  # 添加打印id
    for in range(x):
        l.append(i*i)
    print(l)
 
 
print('---1---')
f(4)
print('---2---')
f(5)

结果:

1
2
3
4
5
6
---1---
140306123906248
[0149]
---2---
140306123906248
[0149014916]

会发现id值是相同的,说明两次执行时使用的都是定义函数时默认的参数

再次修改代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
def f(x,l=[]):
    print(id(l))
    for in range(x):
        l.append(i*i)
    print(l)
 
 
print('---1---')
f(4)
print('---2---')
f(5,[])
print('---3---')
f(6)

结果:

1
2
3
4
5
6
7
8
9
---1---
140017293614280
[0149]
---2---
140017293614472
[014916]
---3---
140017293614280
[014901491625]

会发现执行传递空列表的函数时打印的id不一样,而没有传递的一样。当传递空list时函数体当中会使用传递的空list,没有传递时,使用函数默认的list。所以会产生以上结果

如果想要达到预期的结果编写一下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def f(x,l=None):
    if is None:
        = []
    for in range(x):
        l.append(i*i)
    print(l)
 
 
print('---1---')
f(4)
print('---2---')
f(5)
print('---3---')
f(6)

结果:

1
2
3
4
5
6
---1---
[0149]
---2---
[014916]
---3---
[01491625]

 这样就达到了预期的结果  ------_<_>_------

转载于:https://www.cnblogs.com/lingjiajun/p/9843283.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值