定义函数时不要使用可变类型作为参数的默认值

limalove / 2023-05-03 / 原文

《流畅的Python》第8章 8.4.1小节

 可变默认值导致的这个问题说明了为什么通常使用None作为接收可变值的参数的默认值。

类名.__init__.__defaults__:查看类中形式参数的默认值

函数名.__defaults__属性:查看形式参数的默认值

#形式参数L是可变类型时隐藏的问题
def add_end(L=[]):
    L.append('END')
    return L


print("传入参数,正常调用时:")
print(add_end([1,2,3]))
print(add_end(['a','b','c']))

print("\n不传入参数,使用默认参数调用时:")
print("使用默认参数第一次调用:",add_end())

print("使用默认参数第一次调用后此时参数L的默认值变了,不再是[]:",add_end.__defaults__)
print("使用默认参数第二次调用与第一次调用返回的结果不同:",add_end())

运行结果: