python中函数的默认参数为list时出现异常分析

本文通过一个具体的Python函数示例,解析了默认参数的工作机制,解释了为什么在多次调用时,某些类型的默认参数(如列表)会出现意料之外的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

遇到一个奇怪的现象:

'''python
def f(x,l=[]):
    for i in range(x):
        l.append(i*i)
    print l

f(2)
f(3,[3,2,1])
f(3)
'''

讲道理来说输出应该是

'''python
    [0,1]
    [3,2,1,0,1,4]
    [0,1,4]
'''

可是发现python不讲道理了

'''python
[0, 1]
[3, 2, 1, 0, 1, 4]
[0, 1, 0, 1, 4]
'''

一脸懵逼!
前两个能看懂,最后一个什么鬼?
找了一圈终于被我发现,要弄清楚这个问题得先弄清楚python函数默认参数时怎么工作的

'''python
def test(x,y=1):
print 'y的内存:%s' % id(y)
test(1)
test(2,1)
test(3,2)
test(4)
'''

输出:

'''python
y的内存:30832264
y的内存:30832264
y的内存:30832240
y的内存:30439048
'''

发现了什么?
对!y的内存不会随我们调用函数改变!除非你传入不一样的y的值!
搞清楚这一点之后还需要知道,列表不随它的扩大,减小而改变内存!

'''python
L = []
print id(L)
L.append(1)
print id(L)
'''

输出

39870344
39870344

懂了吧!
还不懂?
不管了!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值