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

版权声明:本文为博主原创文章,欢迎大家转载交流。 https://blog.csdn.net/object_bitch/article/details/85992623

《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]

猜你喜欢

转载自blog.csdn.net/object_bitch/article/details/85992623