《Python+Cookbook》笔记 方法中默认变量 可变导致的默认值更改

本文深入探讨了Python中函数默认参数值的使用陷阱,特别是当默认值为可变类型时可能引发的问题,并提供了正确的实现方式。

《Python+Cookbook》

第七章中在讲解函数默认值时有以下一段话,觉得在实际应用中很有可能不小心犯错而不知道.

默认参数的值应该是不可变的对象,比如 None、 True、 False、数字或字符
串。特别的,千万不要像下面这样写代码:

def spam(a, b=[]): # NO!
如果你这么做了,当默认值在其他地方被修改后你将会遇到各种麻烦。这些修改会
影响到下次调用这个函数时的默认值。

def spam(a, b=[]):
   print(b)
   return b

x = spam(1)
x.append(99)
x.append('Yow!')
print(x)
spam(1) 

执行结果

[]
[99, 'Yow!']
[99, 'Yow!']
[Finished in 0.2s]

返现最后执行 spam(1) 输出内容是 b  的值    但此时输出已是[99, 'Yow!']  说明b的默认值已经改变

修改方法如下


def spam(a, b=None):
   if b is None:
     b = []
   print(b)
   return b

x = spam(1)
x.append(99)
x.append('Yow!')
print(x)
spam(1) 

输出内容
[]
[99, 'Yow!']
[]
[Finished in 0.2s]

判断是不要直接

if not b :

    b = []

这么写的问题在于尽管 None 值确实是被当成 False,但是还有其他的对象 (比如
长度为 0 的字符串、列表、元组、字典等) 都会被当做 False   (这点和java 中有区别,刚学python要注意)
 

另外需要注意的是函数默认参数是变量时,函数的默认值是不会和变量而一同改变的,默认值只会在第一次加载的时候赋予

u=100
def add(x:int, y= u) :
   return x + y
print(add(1))
u=10
print(u)
print(add(1))

输出结果 :

101
10
101
[Finished in 0.1s]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值